如何通过ConvTranspose3d将张量尺寸从[1,64,8,32,32]转为[1,3,16,112,112]
解决3D转置卷积尺寸匹配问题
首先,我们得先明确PyTorch中nn.ConvTranspose3d的输出尺寸计算公式,每个维度(深度D、高度H、宽度W)的输出尺寸遵循:
output_size = (input_size - 1) * stride - 2 * padding + kernel_size + output_padding
你的输入张量是[1, 64, 8, 32, 32],对应维度是(N, C_in, D_in, H_in, W_in),目标输出是[1, 3, 16, 112, 112]。目前你用的参数在深度D维度已经得到了正确的16帧,我们来验证一下:
- D_in=8,stride_D=2,padding_D=1,kernel_size_D=4
- 计算:
(8-1)*2 - 2*1 +4 = 14-2+4=16,完全符合预期。
问题出在高度H和宽度W维度,当前参数得到64,而你需要112。我们可以通过调整这两个维度的stride和padding来匹配目标尺寸,同时保持深度维度的参数不变。
具体参数调整方案
我们需要让H/W维度满足:
112 = (32-1)*stride_HW - 2*padding_HW + kernel_size_HW
假设我们保持kernel_size在H/W维度还是4(和深度维度一致,方便计算),代入公式:
112 = 31*stride_HW - 2*padding_HW +4 → 31*stride_HW -2*padding_HW = 108
通过试算,我们可以找到一组合适的参数:
- stride_HW=4,代入得:
31*4 -2*padding_HW=108 → 124-2*padding_HW=108 → padding_HW=8
这样组合起来,最终的ConvTranspose3d参数应该是:
import torch.nn as nn conv_transpose = nn.ConvTranspose3d( in_channels=64, out_channels=3, kernel_size=(4, 4, 4), # 深度D=4,H/W=4 stride=(2, 4, 4), # 深度D=2(保持帧数翻倍),H/W=4 padding=(1, 8, 8), # 深度D=1(保持帧数正确),H/W=8 bias=False )
验证尺寸
我们可以快速验证一下:
- D维度输出:
(8-1)*2 -2*1 +4=16✔️ - H维度输出:
(32-1)*4 -2*8 +4=124-16+4=112✔️ - W维度输出和H完全一致,也是112 ✔️
- 通道数从64→3,符合要求 ✔️
补充说明
如果之后遇到类似的尺寸匹配问题,你可以直接套用开头的公式,根据目标尺寸反推stride、padding和kernel_size的组合。另外,output_padding参数可以用来微调最后1-2个像素的差异(比如当公式计算结果和目标差1时),但这里我们通过调整stride和padding已经完美匹配,所以不需要用到它。
内容的提问来源于stack exchange,提问作者kkk
相关产品推荐
相关产品推荐

