第4周学习:MobileNetV1, V2, V3

视频学习

MobileNet V1 & V2

传统卷积神经网络内存需求大、运算量大导致无法在移动设备以及嵌入式设备上运行。

MobileNet网络是google团队在2017年提出的,专注于移动端或者嵌入式设备中的轻量级CNN网络。相比于传统的卷积神经网络,在准确率小幅降低的前提下大大减少了模型参数与运算量。

网络中的亮点:

Depthwise Convolution(大大减少运算量和参数数量)。

增加超参数,控制卷积核卷积个数的超参数α和控制输入图像大小的超参数β,这两个超参数是我们人为自己设定的。

 理论上普通卷积的计算量是DW+PW的8-9倍。

 MobileNetV2网络是由google团队在2018年提出的,相比MobileNetV1网络,准确率更高,模型更小。

网络中的亮点:

Inverted Residuals(倒残差结构)

Linear Bottlenecks

倒残差结构使用的是ReLU6激活函数。

 当stride=1且输入特征矩阵与输出特征矩阵shape相同时才有shortcut连接。

MobileNetv3网络详解

亮点:更新了block;使用 NAS 搜索参数;重新设计耗时层结构

更新block 

重新设计耗时层

 重新设计激活函数:

 SE-Net

基于考虑特征通道之间的关系并提出了Squeeze-and-Excitation Networks (简称SENet)。

在我们提出的结构中,Squeeze 和 Excitation 是两个非常关键的操作,所以我们以此来命名。我们的动机是希望显式地建模特征通道之间的相互依赖关系。

另外,是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数来为每个特征通道生成权重,其中参数被学习用来显式地建模特征通道间的相关性。

Reweight的操作,我们将Excitation的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

 将SE模块嵌入到Inception结构

目前大多数的主流网络都是基于这两种类似的单元通过repeat方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的building block 单元中嵌入SE模块,我们可以获得不同种类的SENet。如SE-BN-Inception、SE-ResNet、SE-ReNeXt、SE-Inception-ResNet-v2等等。

HybridSN

2D的CNN很难充分地提取高光谱的空间信息,而3D的CNN则是由于计算量庞大而很少被使用。
本文将2D和3D的CNN进行了结合,使用3D的CNN高光谱的空间特征的提取,使用2D的CNN进行更抽象的层次空间表示。

网络结构如图所示(3个三维卷积,1个二维卷积,3个全连接层):

三维卷积中,卷积核的尺寸为8×3×3×7×1、16×3×3×5×8、32×3×3×3×16(16个三维核,3×3×5维)

二维卷积中,卷积核的尺寸为64×3×3×576(576为二维输入特征图的数量)

 这篇论文介绍了一种混合的3D和2D模型用于高光谱图像分类。本文提出的hybrid dsn模型是将空间光谱和光谱的互补信息分别以三维卷积和二维卷积的形式结合在一起。在三个基准数据集上的实验结果与最新方法进行了比较,验证了该方法的优越性。该模型比3D-CNN模型的计算效率更高。在小的训练数据上也显示出了优越的性能。

代码分析:

首先取得数据,并引入基本函数库。

! wget http://www.ehu.eus/ccwintco/uploads/6/67/Indian_pines_corrected.mat
! wget http://www.ehu.eus/ccwintco/uploads/c/c4/Indian_pines_gt.mat
! pip install spectral
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report, cohen_kappa_score
import spectral
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

定义 HybridSN 类

三维卷积部分:

  • conv1:(1, 30, 25, 25), 8个 7x3x3 的卷积核 ==>(8, 24, 23, 23)
  • conv2:(8, 24, 23, 23), 16个 5x3x3 的卷积核 ==>(16, 20, 21, 21)
  • conv3:(16, 20, 21, 21),32个 3x3x3 的卷积核 ==>(32, 18, 19, 19)

接下来要进行二维卷积,因此把前面的 32*18 reshape 一下,得到 (576, 19, 19)

二维卷积:(576, 19, 19) 64个 3x3 的卷积核,得到 (64, 17, 17)

接下来是一个 flatten 操作,变为 18496 维的向量,

接下来依次为256,128节点的全连接层,都使用比例为0.4的 Dropout,

最后输出为 16 个节点,是最终的分类类别数。

下面是 HybridSN 类的代码:

class_num = 16

class HybridSN(nn.Module):
  ''' your code here '''
  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
# 随机输入,测试网络结构是否通
# x = torch.randn(1, 1, 30, 25, 25)
# net = HybridSN()
# y = net(x)
# print(y.shape)

创建数据集

首先对高光谱数据实施PCA降维;然后创建 keras 方便处理的数据格式;然后随机抽取 10% 数据做为训练集,剩余的做为测试集。

首先定义基本函数,再读取并创建数据集,开始训练100轮。模型测试后:

 最后准确率为97%

思考问题:

3D卷积和2D卷积的区别:多了一个深度通道,这个深度可能是视频上的连续帧,也可能是立体图像中的不同切片

每次分类的结果都不一样原因:网络采用了dropout。Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

想要进一步提升高光谱图像的分类性能:可以给HybridSN加上注意力机制后模型的性能有了提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值