如何在 PyTorch 中实现的 CNN 中的 Conv3D 中查找内核/滤波器维度?

问题描述 投票:0回答:1

我正在运行一个输入尺寸为 1x24x24x8 的模型。 (1为输入通道) 输入将经过编码如下的卷积层:

nn.Sequential(OrderedDict([
(name+'conv1',nn.Conv3d(in_channels=1,out_channels=8,kernel_size=3,padding=1, bias=False)),
(name+'bnorm1',nn.BatchNorm3d(num_features=8)),
(name+'relu1',nn.ReLU(inplace=True)),
(name+'conv2',nn.Conv3d(in_channels=8, out_channels=8,kernel_size=3,padding=1, bias=False)),
(name+'bnorm2',nn.BatchNorm3d(num_features=8)),
(name+'relu2',nn.ReLU(inplace=True))]))

因此在

'conv1'
之后,输入的尺寸将更改为8x24x24x8(8是输出通道)。

kernel_size
是 3。

我能理解的是:

我们有 8 个滤波器,每个滤波器的尺寸为 1x3x3x8 或者每个内核的尺寸为 3x3x8。 这里我几乎确定了过滤器的维度,因为内核立方体将覆盖图像立方体,我们将重复它 8 层。

但是如果在最大池化之后进入另一个卷积层怎么办:

那么输入的大小为 8x12x12x4(8 是输入通道)

nn.Sequential(OrderedDict([
(name+'conv1',nn.Conv3d(in_channels=8,out_channels= 8*2,kernel_size=3,padding=1, bias=False)),
(name+'bnorm1',nn.BatchNorm3d(num_features=8*2)),
(name+'relu1',nn.ReLU(inplace=True)),
(name+'conv2',nn.Conv3d(in_channels= 8*2, out_channels=8*2, kernel_size=3,padding=1, bias=False)),
(name+'bnorm2',nn.BatchNorm3d(num_features=8*2)),
(name+'relu2',nn.ReLU(inplace=True))]
))

因此,在“conv1”之后,输入的尺寸将更改为 16x12x12x4(16 是输出通道)。

kernel_size 为 3

这里,过滤器的数量是多少?我们有 16 个过滤器,这样说对吗? 每个过滤器/内核的尺寸是多少?

如果我们说每个滤波器的尺寸为 8x3x3x4, 那么我们应该有 2 个滤波器才能达到最终尺寸 16x3x3x8,对吗?

如果我们再次说每个滤波器的尺寸为 1x3x3x4,并且我们有 16 个滤波器,那么它如何在 8x12x12x4 的立方体上移动以生成 16x12x12x4?

deep-learning pytorch conv-neural-network 3d-convolution
1个回答
0
投票

只需查看层权重的形状即可

layer = nn.Conv3d(8, 16, kernel_size=3)
print(layer.weight.shape)
>torch.Size([16, 8, 3, 3, 3])
# 16 filters of size (8,3,3,3)
© www.soinside.com 2019 - 2024. All rights reserved.