我正在运行一个输入尺寸为 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?
只需查看层权重的形状即可
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)