深度学习之图像回归(二)

news2025/2/22 20:18:52

前言

这篇文章主要是在图像回归(一)的基础上对该项目进行的优化。(一)主要是帮助迅速入门 理清一个深度学习项目的逻辑 这篇文章则主要注重在此基础上对于数据预处理和模型训练进行优化前者会通过涉及PCA主成分分析  特征选择 后者通过正则化

数据预处理

数据预处理的原因

思路链

未经过处理的原始数据存在一些问题-> 对数据进行处理 (涉及多种方法)->提升模型性能

数据可能存在的问题

  • 冗余信息:数据中可能存在重复的特征或高度相关的特征,这些信息不会为模型提供额外的价值,反而会增加计算负担和过拟合的风险。

  • 噪声数据:数据中可能存在错误、异常值或随机波动,这些数据点可能来源于测量失误、数据录入错误或自然噪声。

  • 高重复度:某些特征或数据点可能高度相似或重复,导致模型对这些重复模式过度拟合,而无法泛化到新的数据。

  • 缺失值:数据中可能存在缺失值,需要通过填充或删除等方式处理。

  • 不一致性:数据可能来自不同的源,格式或单位不一致,需要进行标准化或归一化处理。

最终的目的

  • 提高模型训练效率:减少特征数量和数据维度,降低计算复杂度。

  • 增强模型泛化能力:去除噪声和冗余信息,使模型更专注于数据中的真实规律。

  • 提升模型可解释性:减少特征数量后,模型更容易理解和解释。

数据预处理的方式

这里的几种方式就是对原始数据特征提取的方式不同 或者对

PCA主成分分析

核心:化繁为简 直击核心

是什么:

降维 用更少的维度就表现出多维数据的特征 

为什么:

简化数据 去除冗余

怎么做:

步骤1:整理数据

首先,要把数据整理好,让每个特征的平均值为0。这就好比把一堆杂乱的数据“摆平”,让它们在一个统一的水平线上。这一步在数学上叫做“数据标准化”。

步骤2:找最重要的方向

接下来,PCA会找数据中最“重要”的方向。这里的“重要”是指数据变化最大的方向。想象一下,你有一堆点,PCA会找一条线,让这些点在这条线上的投影尽可能地分散。这条线就是第一个“主成分”。

步骤3:找次重要的方向

找到第一个最重要的方向后,PCA会继续找第二个最重要的方向,但这个方向要和第一个方向垂直(也就是完全独立)。这样,PCA会依次找到多个方向,每个方向都比前一个方向“重要”一点。

步骤4:简化数据

最后,PCA会把数据投影到这些最重要的方向上,得到新的特征。这些新特征就是“主成分”。因为主成分的数量通常比原始特征少,所以数据就被简化了。

def get_feature_importance_with_pca(feature_data, k=4, column=None):
    """
    使用PCA进行特征降维,并找出对前k个主成分影响最大的原始特征。

    参数:
    feature_data (pd.DataFrame or np.ndarray): 特征数据。
    k (int): 选择的主成分数目,默认为4。
    column (list, optional): 特征名称列表。如果feature_data是DataFrame,则可以省略此参数。

    返回:
    X_new (np.ndarray): 降维后的特征数据。
    selected_features (list of lists): 对每个主成分影响最大的原始特征及其载荷。
    """
    # 如果提供了列名或feature_data是DataFrame,获取列名
    if column is None and hasattr(feature_data, 'columns'):
        column = feature_data.columns.tolist()
    elif column is None:
        raise ValueError("Column names must be provided if feature_data is not a DataFrame.")

    # 数据标准化
    scaler = StandardScaler()
    feature_data_scaled = scaler.fit_transform(feature_data)

    # 应用PCA
    pca = PCA(n_components=k)
    X_new = pca.fit_transform(feature_data_scaled)


    return X_new

载荷?

每个数据的原始特征在主成分中的重要性。比如用苹果 梨子 香蕉做一杯混合果汁 最后得到的果汁的新特征包含上述三种水果的味道和营养 这就是一个主成分 是原始特征的线性组合

载荷指的是每种水果在果汁中的贡献比例

比如

50% 苹果 + 30% 橙子 + 20% 香蕉

这里的“50%”、“30%”和“20%”就是每种水果在果汁中的“贡献比例”,在PCA中,这些比例就叫做载荷

特征选择

是什么

假设你有一个数据集,数据集中有很多特征(比如100个特征),但并不是所有特征都对预测结果有帮助。有些特征可能是多余的,或者和目标没有关系。特征选择的目的就是从这100个特征中挑选出最有用的几个特征(比如5个或10个),让模型只用这些重要的特征来学习。

为什么
  1. 减少计算量:模型只需要处理少量的特征,训练速度会更快。

  2. 提高模型性能:去除无关特征后,模型可以更专注于重要的特征,预测效果可能会更好。

怎么办
def get_feature_importance(feature_data, label_data, k =4,column = None):
    model = SelectKBest(chi2, k=k)      # 定义k个特征值的卡方检验得到的特征选择模型
    feature_data = np.array(feature_data, dtype=np.float64) # 特征值转化成浮点数 
    X_new = model.fit_transform(feature_data, label_data)   # 用这个函数选择k个最佳特征
    print('x_new', X_new)
    
    scores = model.scores_                # scores即每一列与结果的相关性
    indices = np.argsort(scores)[::-1]        # 默认小到大排序 [::-1]表示反转一个列表或者矩阵。 最终实现大到小排序 

    if column:                            # 打印
        k_best_features = [column[i+1] for i in indices[0:k].tolist()]         # 选中这些列 打印
        print('k best features are: ', k_best_features)
    
    return X_new, indices[0:k]                  # 返回选中列的特征和他们的下标。
卡方检验

适用场景:

①非负。卡方检验基于频率分布,计算的是观测频数与期望频数之间的差异。因此,它要求输入特征必须是非负的,例如布尔值(0或1)或频率计数

②离散特征。对于连续的需要先进行离散化处理。

③简单易用 快速筛选 

λ的设置
  • λ 过大 → 模型欠拟合(训练和验证损失都很高)
  • \lambdaλ 过小 → 可能过拟合(训练损失低但验证损失高)
  • \lambdaλ 适中 → 平衡拟合与泛化

 正则化的影响路径
  • 正向传播:损失值=预测误差 + 0.00075×所有权重平方和
  • 反向传播:梯度=原始梯度 + 2×0.00075×权重 → 权重会自动变小
  • 物理意义:强制让模型参数趋向于较小的值,抑制模型复杂度

模型训练的优化

模型复杂度的体现

在机器学习中,模型复杂度通常指的是模型的参数数量和参数的大小。一个复杂的模型可能具有以下特点:

  • 参数数量多:模型中有大量的参数,例如深度神经网络中的权重和偏置。

  • 参数值大:模型的参数值(权重)可能很大,这意味着模型对输入特征的响应非常敏感。

复杂模型虽然能够很好地拟合训练数据(甚至可以完美拟合),但往往会过拟合,即在训练数据上表现很好,但在新的、未见过的数据上表现不佳。这是因为复杂模型可能会学习到训练数据中的噪声和细节,而不是数据的真实规律。

为什么要限制模型复杂度

限制模型复杂度的主要目的是提高模型的泛化能力,即让模型在新的、未见过的数据上表现更好。具体原因包括:

  1. 防止过拟合:复杂模型容易过拟合,因为它们可以学习到训练数据中的噪声和细节。通过限制复杂度,模型更倾向于学习数据的基本规律,而不是噪声。

  2. 简化模型:减少模型的参数数量或参数大小,可以使模型更简洁、更易于解释。这也有助于减少计算成本和训练时间。

  3. 提高稳定性:限制复杂度可以减少模型对输入数据的敏感性,使其在面对小的扰动时更加稳定。

如何限制模型复杂度

通过正则化项对损失函数进行约束

原始的损失函数计算

def mseLoss(pred, target, model):
    loss = nn.MSELoss(reduction='mean')        # 计算loss函数

    regularization_loss = 0                    # 正则项
    for param in model.parameters():
        # regularization_loss += torch.sum(abs(param)) # 参数的绝对值之和 L1正则项
        regularization_loss += torch.sum(param ** 2)   # 计算所有参数平方 L2正则项

    return loss(pred, target) + 0.00075 * regularization_loss             # 返回损失。

常见的正则化方法

  1. L1正则化(Lasso)

    • 在损失函数中添加参数的绝对值之和作为惩罚项。

    • 公式:Lossnew​=Loss+λ∑i​∣wi​∣

    • 作用:L1正则化会促使某些参数变为零,从而实现稀疏性(即自动特征选择)。

    • 直观理解:通过惩罚参数的绝对值,强迫模型丢弃一些不重要的特征。

  2. L2正则化(Ridge)

    • 在损失函数中添加参数的平方和作为惩罚项。

    • 公式:Lossnew​=Loss+λ∑i​wi2​

    • 作用:L2正则化会使得所有参数的值变得更小(但不会变为零),从而减少模型对每个特征的依赖。

    • 直观理解:通过惩罚参数的平方,限制参数的大小,使模型更“平滑”。

  3. Dropout

    • 在训练过程中随机丢弃部分神经元的输出。

    • 作用:防止神经元之间的共适应性,减少模型对某些特定输入的依赖,从而提高泛化能力。

  4. Early Stopping

    • 在训练过程中监控模型在验证集上的性能,当性能不再提升时停止训练。

    • 作用:防止模型过度拟合训练数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2303600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中文Build a Large Language Model (From Scratch) 免费获取全文

中文pdf下载地址:https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取码:lshj 原文、代码、视频项目地址:https://github.com/rasbt/LLMs-from-scratch 翻译工具:沉浸式翻译(https://app.immersivetrans…

【鸿蒙开发】第四十四章 Map Kit(地图服务)

目录​​​​​​​ 1 Map Kit简介 1.1 场景介绍 2 开发准备 开通地图服务 3 创建地图 3.1 显示地图 3.1.1 接口说明 3.1.2 开发步骤 1、地图显示 2、设置地图属性 3、开启3D建筑图层 4、地图前后台切换 5、深色模式 3.2 切换地图类型 3.2.1 场景介绍 3.2.2 接…

EasyExcel 自定义头信息导出

需求:需要在导出 excel时,合并单元格自定义头信息(动态生成),然后才是字段列表头即导出数据。 EasyExcel - 使用table去写入:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E…

DeepSeek 提示词:定义、作用、分类与设计原则

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

ubuntu环境编译ffmepg支持nvidia显卡加速

文章目录 1. 安装NVIDIA驱动2. 安装CUDA&NV-CODEC2.1 安装CUDA2.2 安装NV-CODEC 3. 编译ffmpeg3.1 安装依赖3.2 下载源码安装依赖3.3 验证 4. 使用 1. 安装NVIDIA驱动 安装依赖包 sudo apt install -y ubuntu-drivers-common编辑 /etc/modprobe.d/blacklist-nouveau.conf 文…

边缘安全加速(Edge Security Acceleration)

边缘安全加速(Edge Security Acceleration,简称ESA)是一种通过将安全功能与网络边缘紧密结合来提升安全性和加速网络流量的技术。ESA的目标是将安全措施部署到接近用户或设备的地方,通常是在网络的边缘,而不是将所有流…

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…

ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测

文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw:原始的、未经处理的图像数据。 /camera/image_rect&#xff…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时,Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR

原文:ChIP-seqDRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR 大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 在饥饿等能量胁迫条件下,生物体会通过调整…

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高,蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性,分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…

01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片

为了获取训练所需的图片,我们最常用的手段就是自己去写一个爬虫去获取相关图片。本文将重点围绕如何采用爬虫的方式获取训练所需的图片素材进行讲解,为了大家能够够直观的掌握相关技术,参考本文的相关过程和代码获取自己的数据图片素材,笔者将详细介绍实现过程。 1、确定图…

【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记

本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码,当执行 addLast() 与 getLast() 方法时需要遍历链表,效率不高,因此可以添加一个指向链表末尾的索引&am…

Git 工作流程

1、Git 工作流程 http://www.ruanyifeng.com/blog/2015/12/git-workflow.html git push -f origin HEAD^:master 删除服务器上最近的一次提交git push -f origin HEAD^:master 2、Git分支管理 动画形式演示分支效果: http://onlywei.github.io/explain-git-with-…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台,通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括:深度学习模型搜索&…

个人博客5年回顾

https://huangtao01.github.io/ 五年前,看程序羊的b站视频做的blog,受限于网络,只能单向学习,没有人指导与监督,从来没有想过,有没有什么问题? 一、为什么要做个人博客? 二、我是怎么…

nacos编写瀚高数据库插件

1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布&#xff0c;多源输出插件增加为特定输出插件设置记录过滤功能&#xff1b;Elasticsearch 客户端新增异地双中心灾备机制&#xff0c;提升框架高可用性&#xff1b;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…

《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用

专栏简介 《Python实战进阶》专栏共68集&#xff0c;分为 模块1&#xff1a;Web开发与API设计&#xff08;共10集&#xff09;&#xff1b;模块2&#xff1a;数据处理与分析&#xff08;共10集&#xff09;&#xff1b;模块3&#xff1a;自动化与脚本开发&#xff08;共8集&am…

Redis三剑客解决方案

文章目录 缓存穿透缓存穿透的概念两种解决方案: 缓存雪崩缓存击穿 缓存穿透 缓存穿透的概念 每一次查询的 key 都不在 redis 中&#xff0c;数据库中也没有。 一般都是属于非法的请求&#xff0c;比如 id<0&#xff0c;比如可以在 API 入口做一些参数校验。 大量访问不存…