part1 论文视频学习:
ResNet网络中的亮点
1.超深的网络结构(突破1000层)
2.提出residual模块
3.使用batch Normalization加速训练
resnet中两种不同的残差结构:所需要的参数数量差别很大
shortcut实线和虚线的区别:
虚线使用了一个1*1的卷积核来使输入矩阵的高和宽以及深度产生变化。
使用BN时需要注意的问题
- 训练时要将traning参数设置为True,在验证时将trainning参数设置为False。在pytorch中可通过创建模型的model.train()和model.eval()方法控制。
- batch size尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差。
- 建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias,因为没有用,参考下图推理,即使使用了偏置bias求出的结果也是一样的。
常见的迁移学习方式:
1.载入权重后训练所有参数
2.载入权重后只训练最后凡层参数
3.载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层
resnet代码练习
按照如下图所示的网络结构搭建网络
ResNeXt的亮点结构:
和ResNet相比,ResNeXt在ResNet的基础上改进了block的结构,主干改为了分组卷积,在计算量相同的情况下,ResNeXt的错误率更低。
为什么group要设置成32?
通过实验测得,分为32个组的时候错误率最低,准确率最高。
resnext代码练习
按照如下图所示的网络结构搭建网络
part2 猫狗大战
lenet实现
载入训练集
导入库函数
创建数据集
进行训练
输出结果
提交结果(正确率70.05%)
ResNet实现
使用34层的网络进行训练,因为样本数量较大,所以只选择了2000张图片进行训练一轮。
训练结果显示:一轮训练后正确率高达98.1%
提交结果(正确率97.65%)
本周的思考题:
1、Residual learning
残差学习是用来学习恒等映射的残差的,残差结构将这个问题转换为求解网络的残差映射函数,也就是F(x),其中F(x) = H(x)-x,从而,问题转换成了 H(x) = F(x)+x,改变了学习目标,解决了梯度爆炸问题,也很好的解决了退化问题。
2、Batch Normalization 的原理
Normalization是数据标准化(归一化,规范化),Batch 可以理解为批量,把数据分成小批小批进行 stochastic gradient descent,加起来就是批量标准化, 而且在每批数据进行前向传递 forward propagation 的时候, 对每一层都进行 normalization 的处理。BN是对每一个通道的输出数据计算均值方差来进行标准化处理的,切记是按通道的。BN的具体算法如下图所示:
3、为什么分组卷积可以提升准确率?即然分组卷积可以提升准确率,同时还能降低计算量,分数数量尽量多不行吗?
- 分组卷积可以减少参数量。
- 分组卷积可以看成是稀疏操作,有时可以在较少参数量的情况下获得更好的效果(相当于正则化操作)。
- 当分组数量等于输入feature map数量时,输出feature map数量也等于输入feature map数量,这时分组卷积就成了Depthwise卷积,可以使参数量进一步缩减。
分组卷积如果组数太多,各通道之间的信息交互太过困难,甚至导致没有交流,导致特征提取效果不好,影响准确率。