You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置卷积解码器的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,反向代入目标输出尺寸计算参数:

  1. 第一层转置卷积(对应编码器第三层)

    • 输入4x4,目标输出8x8
    • 代入公式解得:padding=1,output_padding=1(满足output_padding < stride=2)
  2. 第二层转置卷积(对应编码器第二层)

    • 输入8x8,目标输出15x15
    • 代入公式解得:padding=2,output_padding=0
  3. 第三层转置卷积(对应编码器第一层)

    • 输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:41:11