第五周作业:卷积神经网络(Part3)

Posted Qxw1012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五周作业:卷积神经网络(Part3)相关的知识,希望对你有一定的参考价值。

一、《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》

1.原文地址

2.TensorFlow官方

3.论文亮点

1.MobileNet模型基于深度可分解卷积(depthwise separable convolutions),它由分解后的卷积组成,分解后的卷积就是将标准卷积分解成一个深度卷积(depthwise convolution)和一个1x1的点卷积(pointwise convolution)。深度卷积将每个卷积核应用于输入的每一个通道;然后,深度卷积的输出作为点卷积的输入,点卷积用1x1卷积来组合这些输入。大大减少了运算量和参数数量。结构如下图所示:

2.引入控制模型大小的超参数:

  • 宽度因子α (Width multiplier ),用于控制输入和输出的通道数。对于深度可分离卷积,其计算量为: D k × D k × α M × D F × D F + 1 × 1 × α M × α N × D F × D F D_k×D_k×αM×D_F×D_F+1×1×αM×αN×D_F×D_F Dk×Dk×αM×DF×DF+1×1×αM×αN×DF×DF
  • 分辨率因子ρ (resolution multiplier ),用于控制输入和内部层表示。即用分辨率因子控制输入的分辨率。对于深度可分离卷积,其计算量为: D k × D k × α M × ρ D F × ρ D F + 1 × 1 × α M × α N × ρ D F × ρ D F D_k×D_k×αM×ρD_F×ρD_F+1×1×αM×αN×ρD_F×ρD_F Dk×Dk×αM×ρDF×ρDF+1×1×αM×αN×ρDF×ρDF

:α,ρ是人为手动设置的,在给出的测试代码中,α,ρ均设置为1。

4.代码学习

:如果真实复现MobileNetV1网络结构,需将代码中的

cfg = [(64, 1), (128, 2), (128, 1), (256, 2), (256, 1), (512, 2), (512, 1),
      (1024, 2), (1024, 1)]

修改成

cfg = [(64, 1), (128, 2), (128, 1), (256, 2), (256, 1), (512, 2), (512, 1),
(512, 1),(512, 1),(512, 1),(512, 1),(1024, 2), (1024, 1)]

参考文章:
论文笔记:MobileNet v1
【深度学习】经典分类网络 亮点及结构
MobileNet网络详解
MobileNets: Efficient CNN for Mobile Vision Applications[1704.04861]

二、《MobileNetV2: Inverted Residuals and Linear Bottlenecks》

1.原文地址

2.非官方Pytorch代码

3.论文亮点

  • Inverted Residuals(倒残差结构),先升维再降维,增强梯度的传播,显著减少推理期间所需的内存占用。
  • 网络为全卷积的,使得模型可以适应不同尺寸的图像;使用 RELU6(最高输出为 6)激活函数,使得模型在低精度计算下具有更强的鲁棒性

  • Linear Bottlenecks,去掉 Narrow layer(low dimension or depth) 后的 ReLU,保留特征多样性,增强网络的表达能力。

注:针对于论文中给出的shortcut连接表述是有误的,只有当stride=1且输入特征矩阵与输出特征矩阵的shape相同时,满足这两个条件的时候,才会有shortcut连接,其他情况均没有。

4.代码学习

2个epoch结果

10个epoch结果


代码细节部分:

cfg = [(1,  16, 1, 1),
			#根据MobileNetV2网络结构,应将老师给出的代码中,(6,  24, 2, 1)应改成(6,  24, 2, 2)
           (6,  24, 2, 2), 
           (6,  32, 3, 2),
           (6,  64, 4, 2),
           (6,  96, 3, 1),
           (6, 160, 3, 2),
           (6, 320, 1, 1)]
应该使用nn.ReLU6代替F.relu激活函数

参考文章:
MobileNetV1 & MobileNetV2 简介

轻量级网络–MobileNetV2论文解读

论文阅记 MobileNetV2:Inverted Residuals and Linear Bottlenecks

MobileNet网络详解
关于shortcut的一点思考

三、《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》

1.原文地址

2.代码

3.论文解读

1.高光谱图像(HyperSpectral Image,简称HSI)是三维立体数据,包含两个空间维度和一个光谱维度。

作者提出HybirdSN模型:将空间光谱和光谱的互补信息分别以3D-CNN和2D-CNN层组合到了一起,从而充分利用了光谱和空间特征图,结合二维和三维卷积的优势,设计的网络结构中先使用三维卷积,再堆叠二维卷积,最后连接分类器。既发挥了三维卷积的优势,充分提取光谱-空间特征,也避免了完全使用三维卷积而导致的模型复杂。

2.网络结构

网络首先进行的PCA降维操作,然后由3层三维卷积(3D Conv)→ 1层二维卷积(2D Conv)→ 2层全连接层(Fc) → 1层softmax分类层组成。

3.代码学习

根据给出的网络结构,搭建网络。参考网上代码,Batch Norm适合用于分类任务,所以在搭建网络的时候,添加Batch Norm可以使训练更容易、加速收敛、防止模型过拟合。


class HybridSN(nn.Module):
  def __init__(self):
    super(HybridSN, self).__init__()
    self.conv3d_1 = nn.Sequential(
        nn.Conv3d(1, 8, kernel_size=(7, 3, 3), stride=1, padding=0),
        nn.BatchNorm3d(8),
        nn.ReLU(inplace = True),
    )
    self.conv3d_2 = nn.Sequential(
        nn.Conv3d(8, 16, kernel_size=(5, 3, 3), stride=1, padding=0),
        nn.BatchNorm3d(16),
        nn.ReLU(inplace = True),
    ) 
    self.conv3d_3 = nn.Sequential(
        nn.Conv3d(16, 32, kernel_size=(3, 3, 3), stride=1, padding=0),
        nn.BatchNorm3d(32),
        nn.ReLU(inplace = True)
    )

    self.conv2d_4 = nn.Sequential(
        nn.Conv2d(576, 64, kernel_size=(3, 3), stride=1, padding=0),
        nn.BatchNorm2d(64),
        nn.ReLU(inplace = True),
    )
    self.fc1 = nn.Linear(18496,256)
    self.fc2 = nn.Linear(256,128)
    self.fc3 = nn.Linear(128,16)
    self.dropout = nn.Dropout(p = 0.4)

  def forward(self,x):
    out = self.conv3d_1(x)
    out = self.conv3d_2(out)
    out = self.conv3d_3(out)
    out = self.conv2d_4(out.reshape(out.shape[0],-1,19,19))
    out = out.reshape(out.shape[0],-1)
    out = F.relu(self.dropout(self.fc1(out)))
    out = F.relu(self.dropout(self.fc2(out)))
    out = self.fc3(out)
    return out

测试结果:

4.问题思考

1.2D卷积和3D卷积的区别?

  • 二维卷积(2D-CNN):可以提取高光谱图像的空间特征(spatial feauture);特点是相对三维卷积,模型比较简单,但不能提取高光谱图像的光谱特征;
  • 三维卷积(3D-CNN):可以同时提取高光谱图像的光谱特征(spectral feature)和空间特征;同时提取三个维度的数据的特征,能同时进行空间和空间特征表示,但数据计算量要比二维卷积大不少;但捕获光谱特征之后可以提升分类准确率;

2、每次分类的结果为什么都不一样?
(1)首先,权重初始化都是随机的,经过梯度下降以后最后的权值肯定也不是相同的。
(2)其次,就是在网络中,为了防止过拟合,采用了Dropout,随机dropout掉不同的隐藏神经元来进行网络训练,所以最终的分类结果也不一样。可以通过model.train(),model.eval()来解决和这个问题。

3、如果想要进一步提升高光谱图像的分类性能,可以如何改进?
添加注意力机制,自从Transformer提出之后,自注意力机制也随即在CV领域大放异彩。Attention是从大量信息中有筛选出少量重要信息,并聚焦到这些重要信息上,忽略大多不重要的信息。权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。

# 通道注意力机制
class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
 
        self.fc1   = nn.Conv2d(in_planes, in_planes // 16, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2   = nn.Conv2d(in_planes // 16, in_planes, 1, bias=False)
 
        self.sigmoid = nn.Sigmoid()
 
    def forward(self, x):
        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
        out = avg_out + max_out
        return self.sigmoid(out)
        
# 空间注意力机制
class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()
 
        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1
 
        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()
 
    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        return self.sigmoid(x)

测试结果,相比较未添加注意力机制的代码,准确率竟然从0.9822下降到0.9771:

5.注意力机制在CV的简单总结

参考文章:

[HSI论文阅读] | HybridSN: Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification

《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》论文阅读

【AI】高光谱图像分类 — HybridSN模型

高光谱图像分类 HybridSN

四、《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》

1.原文地址

2.代码

3.论文解读

  • 强调了residual learning(残差学习)和batch normalization(批量标准化)在图像复原中相辅相成的作用,可以在较深的网络的条件下,依然能带来快的收敛和好的性能。
  • 文章提出DnCNN,在高斯去噪问题下,用单模型应对不同程度的高斯噪音;甚至可以用单模型应对高斯去噪、超分辨率、JPEG去锁三个领域的问题。

参考文章:

<

以上是关于第五周作业:卷积神经网络(Part3)的主要内容,如果未能解决你的问题,请参考以下文章

网络攻防第五周作业

Java ee第五周作业

第五周作业

2017-2018-2 《网络攻防》第五周作业

2017-2018网络攻防第五周作业

2017-2018-2 20179209《网络攻防》第五周作业