一.代码练习
网络部分代码:
class_num = 16
class HybridSN(nn.Module):
def __init__(self,num_classes=16):
super(HybridSN,self).__init__()
self.conv1 = nn.Conv3d(1,8,(7,3,3))
self.bn1=nn.BatchNorm3d(8)
self.conv2 = nn.Conv3d(8,16,(5,3,3))
self.bn2=nn.BatchNorm3d(16)
self.conv3 = nn.Conv3d(16,32,(3,3,3))
self.bn3=nn.BatchNorm3d(32)
self.conv4 = nn.Conv2d(576,64,(3,3))
self.bn4=nn.BatchNorm2d(64)
self.drop = nn.Dropout(p=0.4)
self.fc1 = nn.Linear(18496,256)
self.fc2 = nn.Linear(256,128)
self.fc3 = nn.Linear(128,num_classes)
self.relu = nn.ReLU()
# 论文里有加softmax,但本次实验下loss下降特别慢,因此没有使用
self.softmax = nn.Softmax(dim=1)
def forward(self,x):
out = self.relu(self.bn1(self.conv1(x)))
out = self.relu(self.bn2(self.conv2(out)))
out = self.relu(self.bn3(self.conv3(out)))
out = out.view(-1,out.shape[1]*out.shape[2],out.shape[3],out.shape[4])
out = self.relu(self.bn4(self.conv4(out)))
out = out.view(out.size(0),-1)
out = self.fc1(out)
out = self.drop(out)
out = self.relu(out)
out = self.fc2(out)
out = self.drop(out)
out = self.relu(out)
out = self.fc3(out)
# out = self.softmax(out)
return out
# 随机输入,测试网络结构是否通
x = torch.randn(1,1,30,25,25)
net = HybridSN()
y = net(x)
print(y.shape)
下载相关资源时出现无法访问链接的问题,如下图:
搜寻相关资料后发现应该是防火墙的问题,因此我选择手动下载,然后将文件手动上传导入colab当中
数据处理:
训练:
测试:
可以看到准确率达到了98.14%,效果已经很不错了。
利用高老师提供的代码将分类结果写入文件结果如下:
结果可视化:
二.问题总结
1.训练HybridSN,然后多测试几次,会发现每次分类的结果都不一样,请思考为什么?
之后我又进行了一次测试,发现两次结果确实不同,因为神经网络中采用了dropout机制,导致每次都会随机失活部分神经元,以避免过拟合现象。
2.如果想要进一步提升高光谱图像的分类性能,可以如何改进?
要想进一步提升高光谱图像的分类性能,可以考虑加入SE注意力机制模块。
3.depth-wise conv 和 分组卷积有什么区别与联系?
分组卷积的输出特征图的每个通道,只和输入特征图的一部分通道有关,而这部分通道,就是一个分组(Group);深度可分离卷积就是逐个深度分开卷积,也就是逐个通道分开卷积,以分组卷积为基础,深度可分离卷积是分组为Cin(输入的通道数)的分组卷积。
4.SENet 的注意力是不是可以加在空间位置上?
我认为SENet不可以加在空间上,但CBAM可以。
5.在 ShuffleNet 中,通道的 shuffle 如何用代码实现?
ShuffleNetV2中提出了Shuffle Channel的方法,通过对通道分组,在重新组合通道,到达混合信息的效果。