DAY41 简单CNN
@浙大疏锦行
知识点:
- 数据增强
- 卷积神经网络定义的写法
- batch归一化:调整一个批次的分布,常用与图像数据
- 特征图:只有卷积操作输出的才叫特征图
- 调度器:直接修改基础学习率
作业:尝试手动修改下不同的调度器和CNN的结构,观察训练的差异。
1 数据增强
为了提升数据多样性,可以通过几何变换、像素变换、语义增强等方法扩展模型训练的样本空间多样性。
# 训练集:使用多种数据增强方法提高模型泛化能力
train_transform = transforms.Compose([# 随机裁剪图像,从原图中随机截取32x32大小的区域transforms.RandomCrop(32, padding=4),# 随机水平翻转图像(概率0.5)transforms.RandomHorizontalFlip(),# 随机颜色抖动:亮度、对比度、饱和度和色调随机变化transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),# 随机旋转图像(最大角度15度)transforms.RandomRotation(15),# 将PIL图像或numpy数组转换为张量transforms.ToTensor(),# 标准化处理:每个通道的均值和标准差,使数据分布更合理transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])
注意数据增强一般是不改变每个批次的数据量,是对原始数据修改后替换原始数据。其中该数据集事先知道其均值和标准差,如果不知道,需要提前计算下。
2 CNN模型
卷积的本质:通过卷积核在输入通道上的滑动乘积,提取跨通道的空间特征。所以只需要定义几个参数即可
- 卷积核大小:卷积核的大小,如3x3、5x5、7x7等。
- 输入通道数:输入图片的通道数,如1(单通道图片)、3(RGB图片)、4(RGBA图片)等。
- 输出通道数:卷积核的个数,即输出的通道数。如本模型中通过 32→64→128 逐步增加特征复杂度
- 步长(stride):卷积核的滑动步长,默认为1。
2.1 batch归一化
通常位于卷积层后,BatchNorm 应在池化前对空间维度的特征完成归一化
- 输入 → 卷积层 → Batch归一化层(可选) → 池化层 → 激活函数 → 下一层
- Flatten -> Dense (with Dropout,可选) -> Dense (Output)
深度学习的归一化有2类:
- Batch Normalization:一般用于图像数据,因为图像数据通常是批量处理,有相对固定的 Batch Size ,能利用 Batch 内数据计算稳定的统计量(均值、方差 )来做归一化。
- Layer Normalization:一般用于文本数据,本数据的序列长度往往不同,像不同句子长短不一,很难像图像那样固定 Batch Size 。如果用 Batch 归一化,不同批次的统计量波动大,效果不好。层归一化是对单个样本的所有隐藏单元进行归一化,不依赖批次。
2.2 特征图
卷积层输出的叫做特征图,通过输入尺寸和卷积核的尺寸、步长可以计算出输出尺寸。
特征图就代表着在之前特征提取器上提取到的特征,可以通过 Grad-CAM方法来查看模型在识别图像时,特征图所对应的权重是多少。-----深度学习可解释性
2.3 调度器
在每个 epoch 结束后,需要手动调用调度器来更新学习率,可以在训练过程中调用 scheduler.step()
ReduceLROnPlateau调度器适用于当监测的指标(如验证损失)停滞时降低学习率。是大多数任务的首选调度器,尤其适合验证集波动较大的情况
优化器(Optimizer) | 调度器(Scheduler) |
---|---|
直接更新模型参数 | 调整优化器的学习率参数 |
决定参数更新的方向和步长 | 决定学习率随时间的变化策略 |
必须存在才能训练模型 | 可选组件,用用于提升训练效率 |