文章目录
- 一、《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
- 二、《MobileNetV2: Inverted Residuals and Linear Bottlenecks》
- 三、《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》
- 四、《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》
- 五、《Squeeze-and-Excitation Networks》
- 六、《Deep Supervised Cross-modal Retrieval》
一、《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
1.原文地址
2.TensorFlow官方
3.论文亮点
1.MobileNet模型基于深度可分解卷积(depthwise separable convolutions),它由分解后的卷积组成,分解后的卷积就是将标准卷积分解成一个深度卷积(depthwise convolution)和一个1x1的点卷积(pointwise convolution)。深度卷积将每个卷积核应用于输入的每一个通道;然后,深度卷积的输出作为点卷积的输入,点卷积用1x1卷积来组合这些输入。大大减少了运算量和参数数量。结构如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/922aeb12f661a6d2b76e60d803f1b362.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bcbd575be2bc3a0589a9523f4d31f6bd.png)
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(倒残差结构),先升维再降维,增强梯度的传播,显著减少推理期间所需的内存占用。
![](https://i-blog.csdnimg.cn/blog_migrate/b86ed29232b4681be0a75211d60be907.png)
-
网络为全卷积的,使得模型可以适应不同尺寸的图像;使用 RELU6(最高输出为 6)激活函数,使得模型在低精度计算下具有更强的鲁棒性
-
Linear Bottlenecks,去掉 Narrow layer(low dimension or depth) 后的 ReLU,保留特征多样性,增强网络的表达能力。
注:针对于论文中给出的shortcut连接表述是有误的,只有当stride=1且输入特征矩阵与输出特征矩阵的shape相同时,满足这两个条件的时候,才会有shortcut连接,其他情况均没有。
![](https://i-blog.csdnimg.cn/blog_migrate/12c41ea5484d86624610b40f771b3f0a.png)
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:Inverted Residuals and Linear Bottlenecks
三、《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.网络结构
![](https://i-blog.csdnimg.cn/blog_migrate/6edfaebe8d99ac148ffdb47842c86525.png)
网络首先进行的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
测试结果:
![](https://i-blog.csdnimg.cn/blog_migrate/342fe01a5d994079c8c449f868c16567.png)
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:
![](https://i-blog.csdnimg.cn/blog_migrate/b08430c5d943940e92598c7ddfbada6d.png)
5.注意力机制在CV的简单总结
![](https://i-blog.csdnimg.cn/blog_migrate/4a662f453ac84fd5d722789e9d1d8ce5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/663db6a1ab312cb9b0f02b209ada1822.png)
![](https://i-blog.csdnimg.cn/blog_migrate/774a80969da4ffb810a9a9b710f07121.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eaaf79185881ce5880729bbee38968fd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2df0077d437ab8b0fc3c508f2d98f355.png)
![](https://i-blog.csdnimg.cn/blog_migrate/149f5e8206dce99db9315f4bf6c29319.png)
参考文章:
[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》论文阅读
四、《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》
1.原文地址
2.代码
3.论文解读
- 强调了residual learning(残差学习)和batch normalization(批量标准化)在图像复原中相辅相成的作用,可以在较深的网络的条件下,依然能带来快的收敛和好的性能。
- 文章提出DnCNN,在高斯去噪问题下,用单模型应对不同程度的高斯噪音;甚至可以用单模型应对高斯去噪、超分辨率、JPEG去锁三个领域的问题。
参考文章:
【图像去噪】DnCNN论文详解(Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising)
五、《Squeeze-and-Excitation Networks》
1.原文地址
2.代码
3.论文解读
SENet的核心思想在于建模通道之间的相互依赖关系,通过网络的全局损失函数自适应的重新矫正通道之间的特征相应强度。
1)挤压(squeeze)部分,对卷积后的特征图做全局平均池化,这一步相当于得到所有特征通道的数值分布;
2)激励(excitation)部分,对各个特征通道进行交互,捕获通道间的依赖关系,为每个特征通道生成权重;
3)scale(attention)部分,将生成的权重乘回到原输入特征图中。
通道域的注意力机制一般需要对输入的特征图C×H×W进行全局池化得到一个一维向量1×1×C,然后对这个一维向量进行特征交互,计算相关性,最后将交互之后的特征向量进行归一化得到通道权重向量,将通道权重向量施加到原特征图中
![](https://i-blog.csdnimg.cn/blog_migrate/ba9b28609868e9ef9a1364b8249e77a4.png)
参考文章:
深度学习论文翻译解析(十六):Squeeze-and-Excitation Networks
Squeeze-and-Excitation Networks
六、《Deep Supervised Cross-modal Retrieval》
1.原文地址
2.非官方代码
3.论文解读
本文旨在找到一个通用的表示空间,在其中可以直接比较来自不同模态的样本。
Contribution:
- 提出了一个监督的跨模态学习结构作为不同模态的桥梁。它可以通过保留语义的区分性和模态的不变性有效学习到公共的表达。
- 在最后一层开发了两个具有权重共享约束的子网,以学习图像和文本模态之间的交叉模态相关性。此外,模态不变性损失被直接计算到目标函数中,以消除跨模态差异。
- 应用线性分类器对公共表示空间中的样本进行分类。 这样,DSCM-R最大限度地减少了标签空间和公共表示空间中的辨别损失,从而使学习到的公共表示具有显着性。
网络结构:
![](https://i-blog.csdnimg.cn/blog_migrate/f97df1e055b561de4f2c56cb85276747.png)
- 图像:利用预训练在 ImageNet 的网络提取出图像的 4096
维的特征作为原始的图像高级语义表达。然后后续是几个全连接层,来得到图像在公共空间中的表达。 - 文本:利用预训练在 Google News 上的 Word2Vec 模型,来得到 k维的特征向量。一个句子可以表示为一个矩阵,然后使用一个 Text CNN来得到原始的句子高级语义表达。之后也是同样的形式,后面是几个全连接层来得到句子在公共空间中的表达。
- 为了确保两个子网络能够为图像和文本学到公共的表达,我们使这两个子网络的最后几层共享权重。直觉上这样可以使得同一类的图片和文本生成尽可能相似的表达。
- 最后面是一层全连接层来进行分类。
目标函数:
1.分类的损失,其中
Y
Y
Y 是
l
a
b
e
l
label
label 的
o
n
e
−
h
o
t
one-hot
one−hot表示,计算一下分类结果与
Y
Y
Y 的差别。
![](https://i-blog.csdnimg.cn/blog_migrate/e340efc7776681cebb410a8ba76426fa.png)
2.损失函数包括三项,分别代表模态间的,图像模态的和文本模态的负对数似然。最小化负对数似然相当于最大化概率,这里的概率指的是两个特征属于同一个类别的概率。
![](https://i-blog.csdnimg.cn/blog_migrate/85ca6dc1ad449f83aabc4d41de65ea80.png)
3.为了消除跨模态差异,我们建议最小化所有图像-文本对的表示之间的距离,两种模态公共空间中的距离度量
![](https://i-blog.csdnimg.cn/blog_migrate/9a26aa53cc5e16e0c41db2c0cc503046.png)
参考文章:
论文阅读:深度监督跨模态检索 Deep Supervised Cross-modal Retrieval, CVPR 2019
CVPR2019跨模态检索-Deep Supervised Cross-modal Retrieval
深度监督跨模态检索(DSCMR)