GoogleNet
定义网络
论文指出LocalRespNorm 起到的作用并不大,网络搭建 过程中可以将其舍弃 ,也可以用nn.LocalResponseNorm实现,另外在计算输出大小的时候pytorch默认向下取整,如果要向上取整,ceil_mode = True
3*224*224(Conv1)--->64,112,112(Maxpoo1)--->64*56*56(Conv2)--->64*56* 56(Conv3)--->192*2
192*56*56(Maxpool2)--->192*28*28(Inception3a)--->256*28*28(Inception3b)--->480*28*28
(Maxpool3)--->480*14*14(Inception4a)--->512*14*14(Inception4b)--->512*14*14(Inception4c)
--->512*14*14(Inception4d)--->528*14*14(Inception4e)--->832*14*14(Maxpool4)--->832*7*7
(Inception5a)--->832*7*7(Inception5b)--->1024*7*7(AverPool)--->1024*1*1(linear)--->1000*1*1
(输出节点可自己设置)(softmax)
inception(3a) input
inception(3b)
inception(4a)
inception(4b)
inception(4c)
inception(4d)
inception(4e)
inception(5a)
inception(5b)
depth 代表有几个卷积层,当然池化层depth = 0
网络特色
引入了Inception结构融合不同尺度的特征信息
使用1*1的卷积核进行降维以及映射处理
添加两个辅助分类器帮助训练
丢弃全连接层,使用平均池化层(大大减少模型参数)
AlexNet和VGG都只有一个输出层,GoogLeNet有三个输出层(两个辅助分类层)
网络介绍
Inception结构
之前AlexNet ,VGG 都是串行结构,一系列的卷积层和池化层进行串联,
而Inception结构是并行结构,上一层输出之后,将我们所得到的特征矩阵同时输入到四个分支当中进行处理,处理之后将我们所得到的四个分支特征矩阵按深度拼接,得到输出特征矩阵(图一)
(图二) 多了三个1*1的卷积层 这三个卷积层都是起到了降维的作用
如何降维
辅助分类器(Auxiliary Classifier)
AverPool--->Conv--->Fc--->Fc--->softmax
Aux_Classifier1(4a):
512*14*14(AverPool1)--->4*4*512
528*14*14(AverPool1)--->4*4*528
ResNet
定义网络
网络特色
具有超深的网络结构(突破1000层)
提出residual[rɪ'zɪdʒʊəl] 模块
使用batch Normalization 加速训练(丢弃dropout)
网络介绍
什么原因造成56层结构的效果不如20层结构
会出现梯度消失,梯度爆炸:假设梯度是小于1的,每向前传播一层,都要乘以一个小于1的梯度,当网络越来越深,梯度就会越趋近于0,反之梯度是大于1的,就会出现梯度爆炸。一般是通过对数据的标准化处理,权重初始化 和 Batch Normalization
退化问题 通过残差结构来解决退化问题 ,从右图很清晰的看到,网络层数越多效果越好
残差结构,Residual结构
用虚线框和不用虚线框的根本区别在于 实线框可以直接将输入与卷积之后的输出进行叠加,并且叠加之后的输出是我们理想的size和channel,那对于有些操作更改了channel,size就需要虚线框辅助输入,调整到合适的size和channel
下采样操作 只在Conv3_x,Conv4_x,Conv5_x中的第一层进行操作即虚线残差结构,stride = 2
并且在这三层不仅调整了高度(宽度),也调整了Channel
注意到Conv2_x: 18,34_layer输入的深度和输出的深度是相符的,不需要虚线残差结构调整深度,只有50,101,152_layer需要虚线调整channel,
64*112*112(MaxPool)--->64*56*56(Conv2_x)--->...最终的输出与输入的channel,size相符
64*112*112(MaxPool)--->64*56*56(Conv2_x)--->...256*56*56最终的输出channel 变化了
需要虚线的残差结构进行channel的调整才能实现残差边与残差块的(+)
Batch Normalization
源于:Batch Normalization详解以及pytorch实验_太阳花的小绿豆的博客-优快云博客
需要注意的是 μ和σ是通过数据计算出来的 ,γ和β是通过反向传播过程中不断训练得到的
主要解决的问题是,在我们将数据进行预处理,归一化之后使得数据在[-1,1]区间,但我们经过多次卷积或者池化操作之后得到的数据不一定还满足这一分布规律.我们想在整个训练样本所对应的每一哥特征层都满足分布规律,Banch Normalization的目的就是使feature map 满足mean = 0 std = 1 的分布规律
每一个通道是指一批数据同一个通道的所有数据的均值和方差
使用Banch Normalization 时需要注意的问题
训练时 training参数设置为Trure 验证时将training参数 设置为false 在pytorch中可通过创建模型model.train()方法和model.eval方法控制,在训练过程中在不断的统计mean 与 std,验证过程中使用历史的mean 和std而不是当前所计算的mean,std
batch size 尽可能设置的大一些,设置的越大求的均值和方差越接近整个训练集
建议将 BN层放在Conv 和 Relu之间 ,且卷积层不要使用偏置bias,显然即使设置了偏置结果也是一样的
迁移学习
迁移学习的优势
能够快速的训练出一个理想的结果,当数据集较小时也能训练出理想的效果,
迁移学习,可以使用别人之前预训练好的模型和参数,去训练自己的比较小的数据集,要注意别人的预处理方式
对于浅层的卷积层而言,他们所学习到的信息时比较通用的信息,很大程度上他们不仅在本网络中适用,在其余的网络中也是使用的,将我们学习好的浅层网络的一些参数迁移到我们新的网络当中来,这样我们新的网络就也拥有了识别底层通用特征的能力,就可以更加快速地学习新的数据集的高维特征
ResNext网络结构
在ResNet的基础上进行改进
更新了block ,一般而言对于block depth >=3 才有效果
[0,1],[1,1],[1,1],[0,0]*[1,-1] + [1,1],[1,1],[1,0],[1,0]*[-1,-1] 输入特征矩阵的channel与卷积核的channel相同
[0,1,1,1],[1,1,1,1],[1,1,1,0],[0,0,1,0]*[1.-1,-1,-1]
组卷积 group Convoltion
当分组的个数,与输入特征矩阵的channel保持一致的话,输出特征矩阵的channel,与输入特征矩阵channe保持一致
例如 64*224*224 分为64组 这64组叠加在一起 又形成一个channel为64的特征矩阵
每一个channel可以用一个channnel = 1的卷积核进行卷积 之后再进行拼接DW Conv
MobileNet
定义网络
网络特色
Depthwise Convolution(大大减少运算量和参数数量)DW卷积
增加超参数α,β
网络介绍
轻量化模型,在嵌入式设备中运行