输入尺寸:
torch.Size([4, 64, 8, 56, 56])
计算:
x_rgb = self.rgb_path.layer1(x_rgb)
打印网络结构:
print(a.rgb_path.layer1)
Sequential(
(0): Bottleneck3d(
(conv1): ConvModule(
(conv): Conv3d(64, 64, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
(bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(activate): ReLU(inplace=True)
)
(conv2): ConvModule(
(conv): Conv3d(64, 64, kernel_size=(1, 3, 3), stride=(1, 1, 1), padding=(0, 1, 1), bias=False)
(bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(activate): ReLU(inplace=True)
)
(conv3): ConvModule(
(conv): Conv3d(64, 256, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
(bn): BatchNorm3d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(downsample): ConvModule(
(conv): Conv3d(64, 256, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
(bn): BatchNorm3d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(relu): ReLU(inplace=True)
)
(1): Bottleneck3d(
(conv1): ConvModule(
(conv): Conv3d(256, 64, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
(bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(activate): ReLU(inplace=True)
)
(conv2): ConvModule(
(conv): Conv3d(64, 64, kernel_size=(1, 3, 3), stride=(1, 1, 1), padding=(0, 1, 1), bias=False)
(bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(activate): ReLU(inplace=True)
)
(conv3): ConvModule(
(conv): Conv3d(64, 256, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
(bn): BatchNorm3d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(relu): ReLU(inplace=True)
)
(2): Bottleneck3d(
(conv1): ConvModule(
(conv): Conv3d(256, 64, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
(bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(activate): ReLU(inplace=True)
)
(conv2): ConvModule(
(conv): Conv3d(64, 64, kernel_size=(1, 3, 3), stride=(1, 1, 1), padding=(0, 1, 1), bias=False)
(bn): BatchNorm3d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(activate): ReLU(inplace=True)
)
(conv3): ConvModule(
(conv): Conv3d(64, 256, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
(bn): BatchNorm3d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(relu): ReLU(inplace=True)
)
)
-
conv1
层:- 输入通道数: 64
- 输出通道数: 64
- 核大小: (1, 1, 1)
- 步长: (1, 1, 1)
- 填充: 0
- 输出尺寸计算:
D_out = (D_in - 1) // 1 + 1 = 8 H_out = (H_in - 1) // 1 + 1 = 56 W_out = (W_in - 1) // 1 + 1 = 56 Output size: (4, 64, 8, 56, 56)
-
conv2
层:- 输入通道数: 64
- 输出通道数: 64
- 核大小: (1, 3, 3)
- 步长: (1, 1, 1)
- 填充: (0, 1, 1)
- 输出尺寸计算:
D_out = (D_in - 1) // 1 + 1 = 8 H_out = (H_in + 2 * 1 - 3 + 1) // 1 + 1 = 56 W_out = (W_in + 2 * 1 - 3 + 1) // 1 + 1 = 56 Output size: (4, 64, 8, 56, 56)
-
conv3
层:- 输入通道数: 64
- 输出通道数: 256
- 核大小: (1, 1, 1)
- 步长: (1, 1, 1)
- 填充: 0
- 输出尺寸计算:
D_out = (D_in - 1) // 1 + 1 = 8 H_out = (H_in - 1) // 1 + 1 = 56 W_out = (W_in - 1) // 1 + 1 = 56 Output size: (4, 256, 8, 56, 56)
-
downsample
层:- 输入通道数: 64
- 输出通道数: 256
- 核大小: (1, 1, 1)
- 步长: (1, 1, 1)
- 填充: 0
- 输出尺寸计算:
D_out = (D_in - 1) // 1 + 1 = 8 H_out = (H_in - 1) // 1 + 1 = 56 W_out = (W_in - 1) // 1 + 1 = 56 Output size: (4, 256, 8, 56, 56)
所以经过 layer1
的输出尺寸为 (4, 256, 8, 56, 56)
发现手算和程序计算的结果是一致的。