第4周学习:MobileNetV1, V2, V3

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、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模块升高光谱图像的分类性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值