论文阅读与视频学习
MobileNet V1 & V2
MobileNet V1网络中的亮点:
- Depthwise Convolution (DW卷积)
- 卷积核channel=1
- 输入特征矩阵channel=卷积核个数=输出特征矩阵channel
- 增加了超参数 α \alpha α和 β \beta β
depthwise部分的卷积核参数大部分为零。
因此提出MobileNet V2
MobileNet V3
- 加入了SE模块
- 重新设计耗时层架构
- 减少第一个卷积层的卷积核个数
- 精简 Last Stage
- 重新设计激活函数
h-swish [ x ] = x ReLU 6 ( x + 3 ) 6 \text{h-swish}[x]=x\frac{\text{ReLU}6(x+3)}{6} h-swish[x]=x6ReLU6(x+3)
ShuffleNet
ShuffleNet v1的主要特点如下:
- Shuffle Unit:ShuffleNet v1引入了Shuffle Unit作为其基本构建块。Shuffle Unit通过组合不同的操作来打破通常卷积层的连续性,以增加网络的表达能力。
- 通道混洗(Channel Shuffle):ShuffleNet v1中引入了通道混洗操作,使得网络中的信息可以在不同通道之间进行交换和混合。这样的设计有助于增加网络的灵活性,使得模型可以更好地学习图像中的特征和关系。
SENet
代码作业
class HybridSN(nn.Module):
def __init__(self, in_channels=1, out_channels=class_num):
super(HybridSN, self).__init__()
self.conv3d_features = nn.Sequential(
nn.Conv3d(in_channels,out_channels=8,kernel_size=(7,3,3)),
nn.ReLU(),
nn.Conv3d(in_channels=8,out_channels=16,kernel_size=(5,3,3)),
nn.ReLU(),
nn.Conv3d(in_channels=16,out_channels=32,kernel_size=(3,3,3)),
nn.ReLU()
)
self.conv2d_features = nn.Sequential(
nn.Conv2d(in_channels=32*18,out_channels=64,kernel_size=(3,3)),
nn.ReLU()
)
self.classifier = nn.Sequential(
nn.Linear(64*17*17,256),
nn.ReLU(),
nn.Dropout(p=0.4),
nn.Linear(256,128),
nn.ReLU(),
nn.Dropout(p=0.4),
nn.Linear(128,16)
)
def forward(self,x):
x = self.conv3d_features(x)
x = x.view(x.size()[0],x.size()[1]*x.size()[2],x.size()[3],x.size()[4])
x = self.conv2d_features(x)
x = x.view(x.size()[0],-1)
x = self.classifier(x)
return x
思考题
● 训练HybridSN,然后多测试几次,会发现每次分类的结果都不一样,请思考为什么?
在网络中使用了 Dropout,训练时随机丢弃一些节点,测试时仍然在丢弃,导致每次测试时分类的结果都不一样。
● 如果想要进一步提升高光谱图像的分类性能,可以如何改进?
可以考虑在HybridSN中引入注意力机制;可以探索更复杂的特征融合方式,可以结合多个尺度和层级的特征,采用更先进的融合方法,如Attention机制、多级特征融合等,提升模型对高光谱图像信息的理解和表达能力。
● depth-wise conv 和 分组卷积有什么区别与联系?
- 区别:Depth-wise convolution是对每个通道进行独立的卷积操作,而分组卷积是将输入特征图分为多个组,然后对每个组进行卷积操作。
- 联系:它们都是将大的卷积操作转换为多个小的卷积操作,以减少参数量和计算复杂度,同时在一定程度上保持模型的表达能力。两者都在轻量级神经网络设计中被广泛应用。
● SENet 的注意力是不是可以加在空间位置上?
SENet的注意力机制可以加在空间位置上,通过在空间上计算并应用通道注意力权重,来强调或抑制不同空间位置的特征。同时,它也可以加在通道维度上,通过在通道上计算并应用通道注意力权重,来调整每个通道在全局特征中的重要性。
● 在 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