Part1 论文阅读与视频学习
MobileNet
V1
1.提出背景
2.网络亮点
- Depthwise Convolution(大大减少运算量和参数数量)。
- 增加超参数:控制卷积核卷积个数的超参数α和控制输入图像大小的超参数β,这两个超参数是我们人为自己设定的,并非学习到的。
3.传统卷积和DW卷积
4.DW卷积和PW卷积
PW卷积是卷积核大小为1的传统卷积特例
5.参数量对比
V2
1.提出背景
2.网络亮点
- Inverted Residuals(倒残差结构)
- Linear Bottlenecks
3.Inverted Residuals(倒残差结构)
残差结构两头大中间小,倒残差结构中间大两头小所以称为倒残差,残差结构使用relu激活函数,倒残差结构使用relu6激活函数
4.Linear Bottlenecks
因为ReLu激活函数对于低维特征信息造成大量损失,而对高维特征信息损失很小,所以在倒残差结构最后一个1×1的卷积层,使用线性的激活函数。
V3
1.网络亮点
1.更新了block(bneck)
使用NAS搜索参数
重新设计耗时层结构
ShuffleNet
V1
1.网络亮点
使用channel shuffle增强组间信息的交流
将瓶颈结构中的1×1卷积换为1×1的group卷积可以有效减少计算量
V2
- FLOPS:全大写,指每秒浮点运算次数,可以理解为计算的速度。是衡量硬件性能的一个指标。(硬件)
- FLOPs:s小写,指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。(模型)在论文中常用GFLOPs(1 GFLOPs=10^9 FLOPs)
计算复杂度不能只看FLOPs,还有MAC(内存访问的时间成本),并行等级(在相同的FLOPs下,并行度高的模型要比并行度低的模型速度要快),平台(GUP,CPU等)。
1.提出四条设计高效网络的准则
2.改进之后的瓶颈结构
SENet
上图是我们提出的SE 模块的示意图。给定一个输入,其特征通道数为,通过一系列卷积等一般变换后得到一个特征通道数为的特征。与传统的CNN不一样的是,接下来我们通过三个操作来重标定前面得到的特征。
首先是Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。
其次是Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数来为每个特征通道生成权重,其中参数被学习用来显式地建模特征通道间的相关性。
最后是一个Reweight的操作,我们将Excitation的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
上左图是将SE模块嵌入到Inception结构的一个示例。方框旁边的维度信息代表该层的输出。
这里我们使用global average pooling 作为Squeeze 操作。紧接着两个Fully Connected 层组成一个Bottleneck结构去建模通道间的相关性,并输出和输入特征同样数目的权重。我们首先将特征维度降低到输入的1/16 ,然后经过ReLu激活后再通过一个Fully Connected 层升回到原来的维度。 这样做比直接用一个Fully Connected 层的好处在于:1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;2)极大地减少了参数量和计算量。然后通过一个Sigmoid的门获得0~1之间归一化的权重,最后通过一个Scale的操作来将归一化后的权重加权到每个通道的特征上。
除此之外,SE 模块还可以嵌入到含有skip-connections 的模块中。上右图是将SE 嵌入到ResNet模块中的一个例子,操作过程基本和SE-Inception一样,只不过是在Addition前对分支上Residual的特征进行了特征重标定。如果对Addition后主支上的特征进行重标定,由于在主干上存在0~1的scale操作,在网络较深BP优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。
目前大多数的主流网络都是基于这两种类似的单元通过repeat方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的building block 单元中嵌入SE模块,我们可以获得不同种类的SENet。如SE-BN-Inception、SE-ResNet、SE-ReNeXt、SE-Inception-ResNet-v2等等。
Part2 代码作业
HybridSN
1.高光谱图像(HSI)
HSI即包含光谱信息特别长的图像(包含红外线、紫外线等不可见光光谱),比如:普通照片只有三个通道,即RGB——红、绿、蓝。数据类型是一个m ∗ n ∗ 3 m*n*3m∗n∗3的矩阵,而高光谱图像则是M ∗ N ∗ B M*N*BM∗N∗B(B是光谱的层数:3层RGB+其他光谱层…)。
高光谱图像是一个立体的三维结构,x、y表示二维平面像素信息坐标轴,第三维是波长信息坐标轴。
2.提出背景
传统的2D-卷积处理不好三维的高光谱图像;若只使用3D-卷积,虽然可以提取第三维——光谱维度的特征,能同时进行空间和空间特征表示,但数据计算量特别大,且对特征的表现能力比较差(因为许多光谱带上的纹理是相似的)
所以,作者提出HybirdSN模型(全称是Hybrid SpectralNet——大致翻译为:2D、3D卷积混合的光谱网络):将空间光谱和光谱的互补信息分别以3D-CNN和2D-CNN层组合到了一起,从而充分利用了光谱和空间特征图,来克服以上缺点。
HybirdSN模型比3D-CNN模型的计算效率更高。在小的训练数据上也显示出了优越的性能。
3.实现步骤
(1)PCA主成分分析
- 首先,对于输入的高光谱图像,进行了主成分分析(PCA),减少了第三维数据的一些光谱波段,只保留了对识别物体重要的空间信息;
- 将数据的输入规范化为M ∗ N ∗ B
(2)将数据划分为三维小块
随后将数据划分为重叠的三维小块S ∗ S ∗ B(“厚度”不变),小块的label由中心像素的label决定
(3)三维卷积提取光谱维度特征
(4)二维卷积卷图像特征
(5)全连接输出
- 接下来是一个 flatten 操作(为了输出给全连接层,所以必须是一条二维数据),变为 18496 维的向量;
- 接下来依次为256,128节点的全连接层,都使用比例为0.4的 Dropout(就是扔掉40%的数据,防止模型过拟合);
- 最后输出为 16 个节点,是分类的种数(之所以是16类,是因为它选取的数据集,本身的标签最多就是16类,参见下面的表格)。
4.代码实现
挂载谷歌云盘
首先取得数据
引入基本库
定义hybridsn类,根据测试输出可知定义成功
首先对高光谱数据实施PCA降维;然后创建 keras 方便处理的数据格式;然后随机抽取 10% 数据做为训练集,剩余的做为测试集。
首先定义基本函数:
下面读取并创建数据集:
开始训练 ,训练100个epoch
模型测试
准确率为95.78%
5.3D卷积和2D卷积的区别
对于时序图像信息(如视频、帧序列等)、高光谱遥感图像和医学图像等三维图像,通常采用 3D 卷积操作对图像中的特征完成提取。3D 卷积的操作与 2D 卷积的不同之处在于,输入的图像增加了一个维度,此时的输入变为 3D 张量(tensor), 输入窗口为 3D 张量,卷积核也变为 3D 张量。与 2D 卷积的操作类似,进行 3D 卷积操作时,每次输入窗口和卷积核进行三维互相关操作,得到输出 3D 张量对应位置的一个数值。
思考题
-
训练HybridSN,然后多测试几次,会发现每次分类的结果都不一样,请思考为什么?
因为网络中使用了 Dropout,测试时仍然在丢弃,导致准确率不稳定。
-
如果想要进一步提升高光谱图像的分类性能,可以如何改进?
引入注意力机制,给予重要的通道和不重要的通道不同的权重,取得更好的效果
-
depth-wise conv 和 分组卷积有什么区别与联系?
depth-wise conv就是分组数=输入通道数=输出通道数的特殊分组卷积,depthwise卷积只是单独对每个通道进行卷积运算,分组卷积可以跨通道计算
-
SENet 的注意力是不是可以加在空间位置上?
按照我的理解,从理论上来讲是可以的
-
在 ShuffleNet 中,通道的 shuffle 如何用代码实现?