3DCNN在高光谱数据中的运算过程,以nn.Conv3D为例
高光谱图像介绍
普通的图片是RGB3个维度,高光谱图像就是比普通图像多几十个维度的图像而已。看别人用3dcnn处理高光谱图像没看懂,所以自己总结一下。
直接上代码
//
m = nn.Conv3d(3, 4, (2, 7, 7), stride=1)
input = autograd.Variable(torch.randn(1, 3, 7, 60, 40))
output = m(input)
print(output.size())
# 输出是 torch.Size([1, 4, 6, 54, 34])
input = 长 宽 深度=60 40 7的立方体,一共3个这样立方体
nn.Conv3d(3, 4, (2, 7, 7), stride=1)
1.里面的第一个3是输入通道数 这里要和下面的3个立方体相等(3应该是通道数,因为在3D里面通道是立方体,在2D里通道是个平面)
2.这里的4是输出的立方体的个数(通道数),这个4可以随意更改,你改为5代表要用5个滤波器生成5个立方体
3.这里的(2,7,7)是卷积核大小,这里是长宽深度=772,stride=1代表(1,1,1)就是这个卷积核每次移动1,注意卷积核移动是在3个方向。
粘贴一下计算公式
再粘贴一下代码:
m = nn.Conv3d(3, 4, (2, 7, 7), stride=1)
input = autograd.Variable(torch.randn(1, 3, 7, 60, 40))
下面逐个介绍输出 torch.Size([1, 4, 6, 54, 34])的各个数字的由来:
1:不变,可能是代表一个高光谱图像
4:与nn.Conv3d(3, 4, (2, 7, 7), stride=1)中自定义的输出4相等 四个立方体
6:输入深度是7,卷积核深度是2,步长1,padding=0,则(7+20-2)/1+1=6
54:(60+20-7)/1+1=54
34:(40+2*0-7)/1+1=34