如何设置卷积解码器的padding与output_padding,得到1x9x30x30输出?
解码器参数设置方案
要让输入尺寸为1x96x4x4的张量经过三层转置卷积后输出1x9x30x30,需要对应编码器的卷积计算逻辑反向推导padding和output_padding参数,具体步骤和修改后的代码如下:
编码器尺寸变化逻辑
编码器的三层卷积把1x9x30x30逐步压缩为1x96x4x4:
- 第一层Conv2d:
30x30→15x15(计算:floor((30 + 2*2 -5)/2) +1 =15) - 第二层Conv2d:
15x15→8x8(计算:floor((15 +2*2 -5)/2)+1=8) - 第三层Conv2d:
8x8→4x4(计算:floor((8 +2*1 -3)/2)+1=4)
解码器每层参数推导
转置卷积输出尺寸公式:output_size = (input_size -1)*stride -2*padding + kernel_size + output_padding,反向代入目标输出尺寸计算参数:
第一层转置卷积(对应编码器第三层)
- 输入
4x4,目标输出8x8 - 代入公式解得:
padding=1,output_padding=1(满足output_padding < stride=2)
- 输入
第二层转置卷积(对应编码器第二层)
- 输入
8x8,目标输出15x15 - 代入公式解得:
padding=2,output_padding=0
- 输入
第三层转置卷积(对应编码器第一层)
- 输入
15x15,目标输出30x30 - 代入公式解得:
padding=2,output_padding=1
- 输入
修改后的完整代码
import torch # Input. x = torch.rand(1, 9, 30, 30) # input tensor of size 1x9x30x30 # Encoder. encoder = torch.nn.Sequential( torch.nn.Conv2d(9, 24, kernel_size=5, stride=2, padding=2), torch.nn.ReLU(), torch.nn.Conv2d(24, 48, kernel_size=5, stride=2, padding=2), torch.nn.ReLU(), torch.nn.Conv2d(48, 96, kernel_size=3, stride=2, padding=1), torch.nn.ReLU() ) z = encoder(x) # encoded tensor of size 1x96x4x4 print("Encoded size:", z.shape) # 输出 torch.Size([1, 96, 4, 4]) # Decoder. decoder = torch.nn.Sequential( torch.nn.ConvTranspose2d(96, 48, kernel_size=3, stride=2, padding=1, output_padding=1), torch.nn.ReLU(), torch.nn.ConvTranspose2d(48, 24, kernel_size=5, stride=2, padding=2, output_padding=0), torch.nn.ReLU(), torch.nn.ConvTranspose2d(24, 9, kernel_size=5, stride=2, padding=2, output_padding=1), torch.nn.Sigmoid() ) x_hat = decoder(z) print("Decoded size:", x_hat.shape) # 输出 torch.Size([1, 9, 30, 30])
内容的提问来源于stack exchange,提问作者Jeff Bezos
相关产品推荐
相关产品推荐

