如何在PyTorch实现的CNN中找到Conv 3D中的内核/过滤器维度?

yxyvkwin  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在运行一个模型,输入的维度为1x 24 x24 x8。(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'之后,输入的尺寸将变为8x 24 x24 x8(8是输出通道)。
kernel_size是3。
我能理解的是:
我们有8个过滤器,每个过滤器的尺寸为1x 3x 3x 8,或者每个内核的尺寸为3x 3x 8。这里我几乎可以确定过滤器的尺寸,因为内核立方体将覆盖图像立方体,我们将重复8层。
但是,如果在最大池化之后,它进入另一个卷积层:
然后输入将具有8x 12 x12 x4的大小(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))]
))


因此,在'conv 1'之后,输入的尺寸将更改为16 x12 x12 x4(16是输出通道)。
kernel_size = 3
这里,过滤器的数量是多少?我们有16个过滤器是正确的吗?每个过滤器/内核的维度是多少?
如果我们说每个过滤器的尺寸是8x 3x 3x 4,那么我们应该有2个过滤器才能达到最终尺寸16 x3 x3 x8,对吗?
如果我们说每个过滤器的维度是1x 3x 3x 4,我们有16个过滤器,那么它是如何在8x 12 x12 x4的立方体上移动以生成16 x12 x12 x4的?

0qx6xfy6

0qx6xfy61#

只要看看图层权重的形状

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)

字符串

相关问题