提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
一、MobileNet v1
1.网络亮点
(1)Depthwise Convolution(大大减少运算量和参数数量)
(2)增加超参数α、β
2.Depthwise Convolution
传统卷积:
卷积核channel=输入特征矩阵channel
输出特征矩阵channel=卷积核个数
DW卷积:
卷积核channel=1
输入特征矩阵channel=卷积核个数=输出特征矩阵channel
3.Depthwise Separable Conv
PW卷积:
输入特征矩阵个数与卷积核个数相同
理论上普通卷积计算量是DW+PW的8到9倍
4.超参数α、β
阿尔法为宽度系数,对网络上的每一层卷积的通道数都乘以一个α,表中可以看出,随着阿尔法的减少,计算量和参数会随之减少
β为分辨率系数,用于设置不同的输入图像的分辨率大小。随着分辨率的减少,计算量也随之减少。
二、MobileNet v2
1.网络亮点
倒残差结构
Linear Bottlenecks
2.倒残差结构
在MobileNet V2中,采用倒残差结构,先升维,再卷积,再降维,形成两头小,中间大的结构,称为倒残差结构
3.激活函数
激活函数采用Relu 6函数
针对倒残差结构的最后1x1的卷积层,使用线性的激活函数。而不是Relu激活函数,是因为Relu激活函数对低维特征信息造成大量损失
4.结构
三、MobileNet v3
1.网络亮点
更新Block
使用NAS搜索参数
重新设计耗时层结构
2.引入SE结构(注意力机制)
在bottlenet结构中加入了SE结构,并且放在了depthwise filter之后,如下图。因为SE结构会消耗一定的时间,所以作者在含有SE的结构中,将expansion layer的channel变为原来的1/4,这样作者发现,即提高了精度,同时还没有增加时间消耗。并且SE结构放在了depthwise之后
3.重新设计耗时层结构
(1)减少第一个卷积层的卷积核个数,计算量反而会降低,检测速度更快
(2)精简Last Stage
将延迟时间减少了7毫秒,这是运行时间的11%,并将操作数量减少了3000万MAdds,几乎没有损失准确性。
4.重新设计激活函数
使用h-swish替换swish,swish是谷歌自家的研究成果,颇有点自卖自夸的意思,这次在其基础上,为速度进行了优化。
h-sigmoid激活函数替换sigmoid激活函数
四、SENet
首先是Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。
其次是Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数来为每个特征通道生成权重,其中参数被学习用来显式地建模特征通道间的相关性。
最后是一个Reweight的操作,我们将Excitation的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
SE模块嵌入到Inception结构和嵌入到ResNet模块
五、代码作业
1.3D卷积和2D卷积
2D卷积用于:
图片处理(图通道数channel,图长Height,图宽weight,(channel,height,weight)
3D卷积用于:
视频处理(帧通道数channel,帧数frame,图长Height,图宽weight,(channel,frame,height,weight))
2.网络结构
如图所示,三个三维卷积,一个二维卷积,三个全连接层
3.网络定义
class_num = 16
class HybridSN(nn.Module):
def __init__(self,num_classes=16):
super(HybridSN,self).__init__()
#3D卷积
self.conv1 = nn.Conv3d(1,8,(7,3,3))
self.bn1=nn.BatchNorm3d(8)
self.conv2 = nn.Conv3d(8,16,(5,3,3))
self.bn2=nn.BatchNorm3d(16)
self.conv3 = nn.Conv3d(16,32,(3,3,3))
self.bn3=nn.BatchNorm3d(32)
#2D卷积
self.conv4 = nn.Conv2d(576,64,(3,3))
self.bn4=nn.BatchNorm2d(64)
self.drop = nn.Dropout(p=0.4)
#全连接层
self.fc1 = nn.Linear(18496,256)
self.fc2 = nn.Linear(256,128)
self.fc3 = nn.Linear(128,num_classes)
#ReLU激活函数
self.relu = nn.ReLU()
def forward(self,x):
out = self.relu(self.bn1(self.conv1(x)))
out = self.relu(self.bn2(self.conv2(out)))
out = self.relu(self.bn3(self.conv3(out)))
out = out.view(-1,out.shape[1]*out.shape[2],out.shape[3],out.shape[4])
out = self.relu(self.bn4(self.conv4(out)))
out = out.view(out.size(0),-1)
out = self.fc1(out)
out = self.drop(out)
out = self.relu(out)
out = self.fc2(out)
out = self.drop(out)
out = self.relu(out)
out = self.fc3(out)
return out
4.loss下降情况
5.结果
第一次:
第二次:
6.思考
(1)dropout层将按照一定的概率将训练单元其从网络中移除,由于是随机丢弃,所以每次丢弃的节点不同,结果也就不同。
(2)可以嵌入本次学习的SE模块升高光谱图像的分类性能。