网络中的亮点:
- 超深的网络结构(突破1000层):之前也就十几层
- 提出residual模块
1.如果简单将卷积层和池化层简单的叠加:
(iteration迭代次数)
原因:
- 梯度消失,梯度爆炸。 如何解决:数据标准化,权重初始化,batch normalization
- 退化问题(degradation problem)即:层数越深,错误率反而越大 如何解决:残差结构
下图是ResNet搭建的,实线为验证集的错误率,虚线是训练集的错误率。
可见层数越深,错误率越小,确实解决了degradation problem
提出residual模块
下面是两种残差结构:
看下面注释:左边适合ResNet-34。,右边适合 ResNet-50/101/152.
- 主分支上经过一系列操作得到的结果和输入特征矩阵相加后再用relu。
- 注意:主分支和shortcut的输出特征矩阵shape[C,H,W]必须相同
- 右边:1*1的卷积核用来降维和升维。
- 左边参数比右边参数多。
实线和虚线残差结构有什么不同:
是为了保证 从conv2_x 过渡 到 conv3_x(以及后面)
主分支和shortcut的输出特征矩阵shape[C,H,W]必须相同
18和34层的残差结构:
50和101和152层的残差结构:
batch normalization
参考文章
**目的:**使我们的一批(batch)feature map满足均值为0,方差为1的分布规律。
对于conv1的输入满足某一分布的特征矩阵,但对于conv2而言输入的feature map就不一定满足某一分布规律了。
原参数-均值后再除以方差
看一个例子:
注意:
- 训练的时候将training设为True,验证的时候设为False。在pytorch中可以通过model.train()和model.eval()方法控制
- batch_size尽可能大一点。设置越大越接近整个训练集的均值和方差。
- 建议bn层放在卷积层(conv)和激活层(relu)中间,且卷积层不要用偏置bias。
迁移学习
优势:
- 能快速训练出一个理想的结果(可能2个epoch就能训练出理想结果)
- 当数据集较小时也能训练出理想效果。
注意:如果使用别人预训练模型参数时,要注意别人的预处理方式。要用和别人一样的预处理方法。
conv1等浅层网络的信息是比较通用的,就可以迁移学习了。
常见迁移学习方式 - 载入权重后训练所有参数(如果最后分类类别不一样,最后一层参数无法载入)
- 载入权重后只训练最后几层参数
- 载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层。
学到了什么:
1。import torchvision.models.resnet 再点resnet即可跳到pytorch官方实现的源码
里面有预训练权重可以下载
2https://download.pytorch.org/models/resnet34-b627a593.pth权重链接直接复制到网址上就可以下载,也可以复制到迅雷(因为很多资源迅雷已经存到它自己的服务器上了)
3.train.py在预处理的时候,要采用与人家预处理的方式一样。迁移学习
4train.py(迁移学习,如果不使用的话resnet34()直接传参数即可)载入预训练权重后,更改分类数目为5
注意:修改网络最后一层非线性后,再net.to(device)要不然就会报类似有的变量在gpu,有的在cpu。
5. 在colab上,假的gpu是吧,一轮7min,不过准确率还挺高。5.关于predict.py,要与训练方法一样的标准化处理,准确来说是和val验证集方式一样。
6. 可以看到预测是tulips概率已经高达0.99
8. 还有个坑以后填:批量预测