《深度学习:算法到实战》【第四周】MobileNet V1&V2&V3与ShuffleNet V1与SENet笔记

论文阅读

MobileNet V1

传统的CNN内存消耗大,运算量复杂,无法在各种移动端设备和嵌入式设备运行。

MobileNet是为了移动端和嵌入式设备存在的轻量级CNN,与VGG相比它的准确率只下降了0.9%,参数却只有VGG的 1 32 \frac{1}{32} 321,它的网络结构如下。

在这里插入图片描述

文中主要是通过Depthwise Convolution(DW卷积)以及Pointwise Conv(PW卷积)减少计算量,理论上说,普通卷积的计算量是DW+PW的9倍。

DW卷积是在每个channel进行的,PW卷积可以看作使用 1 ∗ 1 1*1 11的普通卷积将输出的特征图修改成你想要的channel。

在这里插入图片描述

并且作者还新增了两个超参数 α , β \alpha,\beta α,β α \alpha α用于控制卷积核个数, β \beta β用于控制输入图像大小。

MobileNet V2

由于MobileNet V1在实际应用中DW卷积在大部分情况下都没有起到应有的作用,为了解决这个问题作者提出了V2版本。

在MobileNet V2中最大的亮点就是采用了倒残差结构,在ResNet的残差结构中是先降维再升维,中间采用 3 ∗ 3 3*3 33的普通卷积,激活函数是ReLu,而倒残差结构是先升维再降维,中间采用 3 ∗ 3 3*3 33的DW卷积,激活函数为 R e L u 6 = min ⁡ ( max ⁡ ( x , 0 ) , 6 ) ReLu6=\min(\max(x,0),6) ReLu6=min(max(x,0),6)。并且当 s t r i d e = 1 stride=1 stride=1并且输入与输出特征矩阵的大小相同的时候才存在shortcut连接。

在这里插入图片描述

并且作者在倒残差结构的最后一层采用的激活函数不是ReLu而是线性的激活函数,主要是由于作者发现在维度较低时ReLu会导致特征信息损失较多。

在这里插入图片描述

V2的网络结构如下所示,t是扩展因子;c是输出特征矩阵的深度channel;n是bottleneck的重复次数;s是步距只针对第一层,其他层为1。

在这里插入图片描述

MobileNet V3

在倒残差的基础上,引入了SE模块,更新了激活函数。

在这里插入图片描述

在这里插入图片描述

SE是指注意力模块,它对卷积得到的特征矩阵每个channel进行池化处理,再通过两个全连接层得到输出向量,第一个全连接层的结点个数为channel的四分之一,第二个全连接层的结点个数为channel。

在这里插入图片描述

重新设计了耗时层结构,作者发现第一个卷积核个数从32变为16不会对准确率带来比较大的影响,所以作者精简了Last Stage保持了优秀的准确率,提高了运行速度。

在这里插入图片描述

在这里插入图片描述

重新设计了激活函数,目前常用的激活函数是 s w i s h = x ∗ σ ( x ) swish=x*\sigma(x) swish=xσ(x),其中 σ ( x ) \sigma(x) σ(x)是sigmoid函数,但是由于sigmoid函数求导和计算比较复杂,对量化的过程比较不友好,因此在V3版本中使用的是 h a r d − s w i s h = x ∗ R e L u 6 ( x + 3 ) 6 hard{-}swish=x*\frac{ReLu6(x+3)}{6} hardswish=x6ReLu6(x+3),其中 R e L u 6 ( x + 3 ) 6 \frac{ReLu6(x+3)}{6} 6ReLu6(x+3) h a r d − s i g m o i d hard{-}sigmoid hardsigmoid

在这里插入图片描述

V3的网络结构如下。

在这里插入图片描述

在这里插入图片描述

ShuffleNet V1

在ShuffleNet网络中作者提出,ResNeXt中的GConv虽然可以减少参数量,但是GConv的不同组之间信息没有交流,所以作者采用了Channel Shuffle的方式,做到了不同组之间的特征信息交换。

在这里插入图片描述

ShuffleNet中的bottleneck结构。

在这里插入图片描述

ShuffleNet网络结构如下。

在这里插入图片描述

SENet

SENet有两个关键操作,一个是Squeeze,另一个是Excitation,因此得名。SENet的重要结构是SE模块,SE模块示意图如图所示。

4.png

SE模块有三个操作:

  1. Squeeze操作:顺着空间维度进行特征压缩,将二维的特征通道转变为具有全局感受野的实数,并且要保证输出维度和输入特征通道数相匹配,使得靠近输入的层也能获得全局感受野。
  2. Excitation操作:类似于循环神经网络的门的机制,为每个特征通道生成权重,权重参数是通过学习得到的,能显示表现出特征通道间的相关性。
  3. Reweight操作:将得到的权重参数以乘法的形式加权到之前的特征上,实现在通道维度上的特征重标定。

SE模块也在上述的MobileNet V3中被引用。

高光图谱分类

对于HSI分类问题,我们在提取空间信息的同时,也希望能获取到不同波长的光谱信息,而二维CNN是无法处理光谱信息的,也就无法提取到更具有判别性的特征图。幸运的是,三维CNN能够同时提取光谱和空间的特征,但代价是增加计算复杂度。为了充分发挥二维和三维CNN的优势,Swalpa Kumar Roy等人提出了HSI分类模型HybridSN,其模型图如下图所示,它由三个三维卷积、一个二维卷积和三个全连接层组成。

img

参考代码地址,补全网络代码如下。

class_num = 16
 
class HybridSN(nn.Module):
 
  def __init__(self,num_classes=16):
    super(HybridSN,self).__init__()
    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)
 
    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)
 
    self.relu = nn.ReLU()
 
    self.softmax = nn.Softmax(dim=1)
 
  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)
    # out = self.softmax(out)
    return out
 
 
# 随机输入,测试网络结构是否通
x = torch.randn(1,1,30,25,25)
net = HybridSN()
y = net(x)
print(y.shape)

跑了20个epoch,准确率在95.8%左右。

在这里插入图片描述

在这里插入图片描述

思考题

  1. 训练HybridSN,然后多测试几次,会发现每次分类的结果都不一样,请思考为什么?

没有使用 n e t . e v a l ( ) net.eval() net.eval()将模型切换至测试模式。因为在FC使用了 s e l f . d r o p = n n . D r o p o u t ( p = 0.4 ) self.drop = nn.Dropout(p=0.4) self.drop=nn.Dropout(p=0.4),而每次失活的节点是随机的,所以导致了分类结果不一样。

  1. 如果想要进一步提升高光谱图像的分类性能,可以如何改进?

可以尝试加入注意力机制,并且通过加入在HybridSN模型不同位置上作比较(结果没有在上面呈现),发现把Attention加在第三个三维卷积后,二维卷积之前比加在二维卷积后效果更好。我认为这是因为高光谱图像经过二维卷积之后会损失一部分光谱信息,如果将注意力机制加在二维卷积之后,那么Attention抽取关键信息的效果就不明显了(会忽略少部分光谱信息的关键区域),所以应该把Attention加在第三个三维卷积后,这样会保留更多的光谱信息,从而进一步提升高光谱图像的分类性能。

  1. 分组卷积与dw卷积的区别与联系?

(1)分组卷积的卷积核仍然是三维的,只不过卷积的输入通道和输出通道都是在分组内进行的。此外,输出通道数可以与输入通道数不相等。

(2)depthwise卷积的卷积核是二维的,输出通道数等于输入通道数,输出通道与输入通道间是一一对应的。

(3)分组卷积和dw卷积都是为了降低运算量而被引入的方式, 3 ∗ 3 3*3 33卷积的话DW卷积的运算量是标准卷积运算量的 1 9 \frac{1}{9} 91,分组卷积可将参数量减小为原来的 1 g \frac{1}{g} g1

  1. SENet 的注意力是不是可以加在空间位置上?

这个问题没太看懂…

  1. 在 ShuffleNet 中,通道的 shuffle 如何用代码实现?
def channel_shuffle(x: Tensor, groups: int) -> Tensor:

    batch_size, num_channels, height, width = x.size()
    channels_per_group = num_channels // groups

    # reshape
    # [batch_size, num_channels, height, width] -> [batch_size, groups, channels_per_group, height, width]
    x = x.view(batch_size, groups, channels_per_group, height, width)

    x = torch.transpose(x, 1, 2).contiguous()

    # flatten
    x = x.view(batch_size, -1, height, width)

    return x

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值