数据增广:
随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力
左右反转,上下翻转....(符合实际),切割(变形到固定形状),明亮度,色调
图片增广代码实现:
定义辅助函数apply,此函数在输入图像img上多次运行图像增广方法aug并显示所有结果。
翻转使用transforms模块来创建RandomFlipLeftRight实例,这样就各有50%的几率使图像向左或向右翻转。
上下翻转:
随机裁剪一个面积为原始面积10%到100%的区域,该区域的宽高比从0.5~2之间随机取值。 然后,区域的宽度和高度都被缩放到200像素。
改变亮度:
改变色调:
随机更改图像的亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue):
通过构建一个Compose实例结合多种方法:
使用图像增广进行训练:
从CIFAR10中下载图片
对训练集做简单的左右翻转
加载数据集 + 构建 DataLoader"封装成了一个辅助函数
train_batch_ch13函数:负责一个batch的前向和反向传播
微调(重要)
一般的神经网络结构:
微调的含义
一般的步骤:
(1)在源数据集(例如ImageNet数据集)上预训练神经网络模型,即源模型。
(2)创建一个新的神经网络模型,即目标模型。这将复制源模型上的所有模型设计及其参数(输出层除外)。我们假定这些模型参数包含从源数据集中学到的知识,这些知识也将适用于目标数据集。我们还假设源模型的输出层与源数据集的标签密切相关;因此不在目标模型中使用该层。
(3)向目标模型添加输出层,其输出数是目标数据集中的类别数。然后随机初始化该层的模型参数。
(4)在目标数据集(如椅子数据集)上训练目标模型。输出层将从头开始进行训练,而所有其他层的参数将根据源模型的参数进行微调。
具体案例演示微调:热狗识别
数据集包含1400张热狗的“正类”图像,以及包含尽可能多的其他食物的“负类”图像。 含着两个类别的1000张图片用于训练,其余的则用于测试
规范化图片,增广
下载模型,指定pretrained=True以自动下载预训练的模型参数
更改输出层fc并利用xavier初始化参数
训练核心:
param_group 分参数组优化
params_1x除fc外的所有层:用较小的lr,预训练权重已经很好,只需微调
net.fc.parameters()最后一层全连接层:用较大lr,随机初始化,需要快速学习