D2L: ResNet
ResNetConcept and Principle
加更多的层不一定总是改进精度
新的层可能是使模型收敛范围偏差到一个不符合预期的区域
ResNet使各层更容易学会恒等变换,从而更容易使模型收敛范围达到Nested function classes
残差块
基本的ResBlock结构如下,f(x)+x保证了包含原收敛范围
具体使用时,ResBlock的设计细节
ResNet架构一般来说现在的主流设计架构就是接入一个Stage(7x7Conv-3x3MP),之后再连接具体想要的网络架构,ResNet架构如下也是这种设计思想,具体架构如下
Tricks
实际应用中,Res34用的最多,达不到要求可以继续用Res50
Res152、Res101一般用来刷榜
Implementation12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667from torch impo ...
D2L: Batch Normalization
Batch NormalizationConcept and Principle
问题
损失出现在最后,由BP算法和梯度消失,后面的层训练的会更快
数据在最前面,前面的层训练的慢且前面的层变化后面的层也要跟着变(抽取的底层信息变化让后面的层要重新学),所以后面的层要重新学习很多次,导致收敛变慢
考虑在学习底部层时避免变化顶部层
批量归一化
固定小批量里面的均值和方差,然后再做额外的调整(可学习的参数gama和beta)
是线性变换
作用在
全连接层和卷积层输出后,激活函数前
全连接层和卷积层输入前
对于全连接层作用于特征维
对于卷积层作用于通道维(将每一个像素都当作一个样本,通道数就是一个样本的特征数)
批量归一化在做什么?
最初的论文是想用它来减少内部协变量转移(使每一层的输出分布变化不那么剧烈)
后续有论文指出,批量归一化可能只是在小批量中加入噪声控制模型复杂度
总结
批量归一化固定小批量中的均值和方差,然后学习出适合的偏移和缩放
批量归一化可以加速收敛(可以设置更大的学习率),一般不改变模型精度
Implementation12345678910111213 ...
D2L: GoogLeNet
GoogLeNetConcept and Principle
Inception块
4个路径从不同层面抽取信息,然后再输出通道合并,最终输出高宽与输入相等,要把更多的通道数留给比较重要的通道
要达到相同的输出通道数,Inception块与直接的3x3或5x5卷积相比,参数和计算复杂度更低
GoogLeNet
5个stage(高宽减半一次就是一个stage),9个Inception块
Inception后续具有多个变种
Inception-BN(v2):使用batch normalization
Inception-v3:修改了inception块
Inception-v4:使用了残差连接
Implementation12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364import torchfrom torch import nn,optimimport d2lclass Inceptio ...
D2L: NiN
NiNConcept and Principle
全连接层的问题:
全连接层参数比卷积层的参数多很多,导致很多的内存(显存)及计算带宽占用
全连接层容易带来过拟合
NiN思想:完全不要全连接层
NiN块:
一个卷积层后跟两个起到全连接层的作用的卷积层
起到全连接层的作用的卷积层为1x1步幅为1无填充的卷积层
NiN架构
无全连接层
交替使用NiN块和步幅为2的最大池化层
最后使用全局平均池化层得到输出(通道数是类别数)
Implementation1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import torchfrom torch import nn,optimclass NiNBlock(nn.Module): def __init__( self,in_channels,out_channels, kernel_size,stride,padding ): sup ...
D2L: VGGNet
VGGNetConcept and Principle
AlexNet的设计很随意,如何变大变深无规律性,VGG探讨了如何对CNN进行扩展
如何更深更大?
更多全连接层(太贵)
更多的卷积层
将卷积层组合成块(VGG)
VGG块
使用小卷积核深网络比大小卷积核浅网络效果好
3x3卷积层(n层、m通道)
2x2最大池化层
VGG架构
多个VGG块后接全连接层
不同次数的重复块得到不同架构(VGG-16、VGG-19等)
Implementation1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import torchfrom torch import dropout, nn,optimimport d2l# 返回VGG块def vgg_block(num_convs,in_channels,out_channels): layers=[] for _ in range(num_convs): layers.append( ...