PyTorch深度学习实战——模型训练实用技巧

0. 前言

我们已经学习了多种图像分类模型的构建方法。在本节中,我们介绍在实际构建模型时影响模型性能的因素,包括数据质量(处理不平衡数据)、数据预处理(对象大小)、模型选择、超参数优化和正则化等,了解这些因素能够帮助我们更好地训练和优化机器学习模型。

1. 处理不平衡数据集

假设,如果我们需要预测一个在数据集中很少出现的对象,例如仅占总图像的 1%,例如,预测 X 射线图像是否暗含了罕见肺部感染。
我们如何衡量训练后的模型预测罕见肺部感染的准确率?如果我们简单地预测所有图像为未感染类,则分类的准确率为 99%,但这对于实际情况并无多少作用,我们希望模型可以尽可能多的正确预测出肺部感染类。混淆矩阵对于描述稀有对象类别出现次数和模型正确预测稀有对象类别的次数时非常有用。因此,要正确评估不平衡数据集的性能应使用与混淆矩阵相关的指标。经典的混淆矩阵如下所示:

预测值
真实值 0 1
0 TN FP
1 FN TP

针对肺部感染任务,在混淆矩阵中,我们可以使用 0 代表没有感染,1 代表感染。
接下来,我们介绍如何在训练过程中提高不平衡数据集模型性能。通常,损失函数(二元或分类交叉熵)在错误分类量较高时具有较大损失值,但是,除了损失函数外,我们还可以为稀有类别图像分配更高的权重,从而确保向模型明确我们想要正确分类稀有类别图像,在模型训练过程中,损失函数会更关注少数类别的正确分类,从而提高模型对少数类别的识别能力。
除了分配类别权重外,图像增强/迁移学习同样有助于提高模型的准确性。此外,在增强图像时,我们可以对稀有类别图像进行过采样,通过减少多数类样本(欠采样)或增加少数类样本(过采样)来平衡数据集,以增加稀有类别图像在数据集中的比例。欠采样方法包括随机删除样本、聚类删除样本等,过采样方法包括复制样本、合成新样本等。需要注意的是,过采样可能导致过拟合,而欠采样可能导致信息丢失。因此,应谨慎选择适合问题的重采样方法。
也可以利用集成学习的思想,将多个分类器组合起来进行预测。例如,使用 BaggingBoostingStacking 等集成方法,可以通过组合不同的模型或对数据集进行不同的采样来改善不平衡数据集的分类效果。或者引入阈值调整,对预测结果的阈值进行调整,使得模型在分类时更加关注少数类别。通过调整阈值,可以平衡精确度 (Precision) 和召回率 (Recall) 之间的权衡,从而提高模型在不平衡数据集上的性能。

2. 图像中对象的大小

有时,决定图像类别的像素仅仅占据图像中的一小部分,例如,肺部感染识别中,其中某些微小结节的存在表明存在疾病。在这种情况下,由于对象仅仅占据整张图像的一小部分,图像分类结果可能并不准确。
解决这一问题的方式是将输入图像划分为较小的网格单元(例如划分为 10 x 10 的网格),然后确定网格单元是否包含感兴趣的对象。
或者可以采用多尺度处理:将图像缩放到不同的尺度,在不同尺度下进行目标检测或图像分割。例如,可以使用图像金字塔或多尺度滑动窗口的方法来检测小尺寸对象,提高模型对小对象的检测准确性。

3. 处理训练数据和验证数据之间的差异

假设,我们已经建立了一个模型来预测眼睛图像是否表明患者患有糖尿病视网膜病变。为了构建模型,首先收集数据,对其进行了整理、裁剪、标准化,然后构建了一个在验证图像上具有非常高准确率的模型。然而,假设,当模型部署在真实环境中使用时,模型可能会由于以下原因,并不能得到较好的预测结果:

  • 实际拍摄的图像与用于训练模型的图像并不相似
    • 训练模型时使用的数据是预处理后的精选数据集,而在实际图像可能未经过精选,因此训练时使用的图像和真实世界的图像可能会有较大不同
  • 与用于训练模型以收集图像的设备相比,实际中捕获图像的设备具有不同的分辨率,则图像可能有所不同
    • 捕获图像的照明条件不同,则图像可能会有所不同
  • 图像并不足以代表整个类别
    • 例如模型是在男性图像上进行训练,在女性图像上进行测试
  • 训练和验证集的划分不合理
    • 例如,在一个有 10,000 张图像的数据集中,前 5,000 张图像属于一个类别,后 5,000 个图像属于另一个类别。在构建模型时,如果我们不将数据集随机化,而是将数据集拆分为使用连续索引的训练和验证集,可能会在训练集中以极高的概率出现某一类别,而在验证期间只会出现另一类别

一般来说,在实际部署系统之前,我们需要确保训练、验证和真实图像都具有相似的数据分布。

4. flatten 层的节点数

假设使用模型处理尺寸为 300 x 300 的图像,我们可以执行数个卷积池化操作,以获得尽可能多的特征图,可以使用卷积神经网络获得任意数量的通道,但一般来说,在设计网络时,展平层 (flatten) 中通常具有 500-5,000 个节点。
如果 flatten 层中的节点数量较多,那么将 flatten 层在连接到输出层时,参数量将非常庞大。一般来说,最好使用预训练模型获取展平层,以便激活相应的卷积核,此外,在利用预训练模型时,应该冻结预训练模型的参数。通常,在一个较简单的分类任务中,卷积神经网络中可训练参数的数量在 100 万到 1000 万之间。
综上,设计 Flatten 层的节点数需要根据输入数据的特征维度、输出形状需求和整体网络结构进行综合考虑。灵活地调整节点数,可以满足模型的需求并保持网络的良好性能。

5. 图片大小

较大的图片尺寸会导致输入数据维度增加,进而增加了模型的参数量和计算量。这可能需要更大的模型容量来处理更多的输入信息。如果模型容量不足以适应较大的图片尺寸,则可能导致欠拟合或性能下降。同时,较大的图片尺寸通常会导致训练时间延长,因为需要更多的计算资源和内存来处理大量的像素值。训练时间的增加可能会对模型的迭代次数和收敛速度产生影响。
假设我们需要处理尺寸较大图像(例如,2,000 x 1,000),需要考虑以下可能性:

  • 将图像调整为较小的尺寸。如果调整大小,普通图像可能不会丢失信息;但是,如果是文本文档,将图像调整为较小的尺寸可能会丢失大量信息
  • 使用较小的批大小以适应 GPU 内存。通常,如果处理尺寸较大的图像,使用较大的批大小,可能导致 GPU 内存不足而无法对批图像执行计算

根据具体任务和数据集的特点,选择合适的图片尺寸对于模型的性能至关重要。需要综合考虑计算资源、训练时间、模型容量和数据样本等因素,平衡模型性能和效率之间的关系。定期调整图片尺寸并进行实验评估,可以找到最适合特定任务和数据集的图片尺寸。

6. 利用 OpenCV 实用程序

OpenCV 是一个开源库,它包含大量模块,用于从图像中获取信息,它是最流行的计算机视觉库之一。在深度学习了流行之前,OpenCV 使用多种手工设计的特性,随着深度学习技术的发展和完善,OpenCV 已经集成了一些深度学习模型相关的包。
如果我们需要将模型部署至生产环境,通常倾向于降低复杂性,有时甚至以准确性为代价,如果能够使用 OpenCV 模块解决问题,通常应该优先使用 OpenCV 模块,除非从头开始构建模型相比利用现成的模块能够显着提高准确率。

相关链接

PyTorch深度学习实战(1)——神经网络与模型训练过程详解
PyTorch深度学习实战(2)——PyTorch基础
PyTorch深度学习实战(3)——使用PyTorch构建神经网络
PyTorch深度学习实战(4)——常用激活函数和损失函数详解
PyTorch深度学习实战(5)——计算机视觉基础
PyTorch深度学习实战(6)——神经网络性能优化技术
PyTorch深度学习实战(7)——批大小对神经网络训练的影响
PyTorch深度学习实战(8)——批归一化
PyTorch深度学习实战(9)——学习率优化
PyTorch深度学习实战(10)——过拟合及其解决方法
PyTorch深度学习实战(11)——卷积神经网络
PyTorch深度学习实战(12)——数据增强
PyTorch深度学习实战(13)——可视化神经网络中间层输出
PyTorch深度学习实战(14)——类激活图
PyTorch深度学习实战(15)——迁移学习
PyTorch深度学习实战(16)——面部关键点检测
PyTorch深度学习实战(17)——多任务学习

猜你喜欢

转载自blog.csdn.net/LOVEmy134611/article/details/131928505
今日推荐