imgs = torch.randn(4, 3, 8, 224, 224)这个是输入
x_rgb = self.rgb_path.conv1(imgs)这个是卷积
卷积结构为ConvModule(
(conv): Conv3d(3, 64, kernel_size=(1, 7, 7), stride=(1, 2, 2), padding=(0, 3, 3), bias=False)
(bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(activate): ReLU(inplace=True)
)
在这个 ConvModule 中,64 表示输出通道数。
具体来说:
(conv): Conv3d(3, 64, kernel_size=(1, 7, 7), stride=(1, 2, 2), padding=(0, 3, 3), bias=False)
输入通道数: 3
输出通道数: 64
也就是说这个 3D 卷积层会将输入的 3 个通道映射到 64 个输出通道。
这个输出通道数 64 就是这个卷积层的"宽度"或者"深度"。它决定了这个卷积层会输出 64 个特征图。后面的 BatchNorm3d(64, ...) 和 ReLU() 层都是针对这 64 个输出通道进行操作的。
所以总的来说,64 表示的就是这个卷积层的输出通道数。它是这个卷积层的一个重要超参数,决定了这个层输出特征的丰富程度。
计算过程:
根据提供的输入尺寸和卷积层结构,我们可以计算出卷积层的输出尺寸。
输入尺寸:
imgs = torch.randn(4, 3, 8, 224, 224)
- Batch size: 4
- 输入通道数: 3
- 输入深度: 8
- 输入高度: 224
- 输入宽度: 224
卷积层结构:
ConvModule( (conv): Conv3d(3, 64, kernel_size=(1, 7, 7), stride=(1, 2, 2), padding=(0, 3, 3), bias=False) (bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (activate): ReLU(inplace=True) )
- 输入通道数: 3
- 输出通道数: 64
- 核尺寸: (1, 7, 7)
- 步长: (1, 2, 2)
- 填充: (0, 3, 3)
根据卷积计算公式:
- 输出深度:
D_out = floor((D_in + 2 * padding[0] - (kernel_size[0] - 1) - 1) / stride[0]) + 1 = floor((8 + 2 * 0 - (1 - 1) - 1) / 1) + 1 = 8
- 输出高度:
H_out = floor((H_in + 2 * padding[1] - (kernel_size[1] - 1) - 1) / stride[1]) + 1 = floor((224 + 2 * 3 - (7 - 1) - 1) / 2) + 1 = 112
综上所述,经过这个卷积层后,输出特征图的尺寸为 (4, 64, 8, 112, 112)
。
# 图像数据
imgs = torch.randn(4, 3, 8, 224, 224)
# 热度图数据
heatmap_imgs = torch.randn(4, 17, 32, 56, 56)
# 调用 forward 函数
a = RGBPoseConv3D()
print(a.rgb_path.conv1)
output = a.forward(imgs, heatmap_imgs)
发现手动计算和程序自动计算是一致的
接下来,BatchNorm3d 和 ReLU 层不会改变张量的形状,所以最终 x_rgb 的形状也是 (4, 64, 8, 112, 112)。
转载请注明来自csdn: 2D、3D卷积后特征图大小公式