Pytorch 转置卷积nn.ConvTranspose2d 参数设置总结

本文总结Pytorch中用转置卷积还原卷积过程的参数设置。

直接上栗子,卷积过程:
5×5输入特征图,步长 s = 2 s=2 s=2,卷积核 k = 3 k=3 k=3,填充 p = 1 p=1 p=1

输出特征图为 5 − k + 2 p s + 1 = 3 \displaystyle \frac{5-k+2p}{s}+1=3 s5k+2p+1=3

在这里插入图片描述
转置卷积过程如上图:

  1. 3×3特征图内部填充:相邻2行/列间插入 s − 1 s-1 s1行/列0值
  2. 3×3特征图外部填充: p a d d i n g = k − p − 1 padding=k-p-1 padding=kp1
  3. 卷积核同 k k k,步长始终为1。

注:图像转置卷积的方法并不止一种,上述解释只适用于大部分常见情况。

看一下Pytorch中转置卷积nn.ConvTranspose2d()的主要参数:

in_channels: int,
out_channels: int,
kernel_size: _size_2_t,
stride: _size_2_t = 1,
padding: _size_2_t = 0,
output_padding: _size_2_t = 0,

注意:参数kernel_size,padding,stride指的都不是转置卷积中的,而是卷积过程的,转置卷积中的填充不需要自己算,Pytorch帮我们解决了……也就是说这3个参数,卷积的时候填啥,转置卷积就填啥,开心~

最后解释一下参数output_padding。在栗子中,如果将输入特征图尺寸改为6×6,根据公式,输出依然为3×3,不够步长的最后1行/列会被舍弃。这样的话,转置卷积依然得到5×5就没有达到还原的目的,也无法一一对应。
因此,参数output_padding=1的含义就是在扩张3×3特征图时,再加上1行1列的填充。在这里插入图片描述
总 之 \color{red}{总之} ,卷积计算公式中出现向下取整的情况,就需要设定output_padding=卷积时舍弃的行/列数。

牛刀小试
4×4输入特征图,步长 s = 1 s=1 s=1,卷积核 k = 3 k=3 k=3,填充 p = 0 p=0 p=0
输出特征图为 4 − k + 2 p s + 1 = 2 \displaystyle \frac{4-k+2p}{s}+1=2 s4k+2p+1=2

那么转置卷积时,2×2特征图内部填充为 s − 1 = 0 s-1=0 s1=0,外部填充为 k − p − 1 = 2 k-p-1=2 kp1=2,卷积时没有向下取整,参数output_padding=0。
在这里插入图片描述

### PyTorch `nn.ConvTranspose2d` 中 `padding_mode` 参数详解 在 PyTorch 的 `nn.ConvTranspose2d` 函数中,`padding_mode` 参数用于指定填充模式。此参数决定了如何处理超出输入张量边界的区域[^1]。 支持的填充模式有: - **zeros**: 默认选项,在边界外填充零值。 - **reflect**: 反射边缘像素进行填充。例如,对于序列 `[a, b, c]`,反射后的序列为 `[b, a | a, b, c | c, b]`。 - **replicate**: 复制最接近的边缘像素作为填充。例如,对于序列 `[a, b, c]`,复制后的序列为 `[a, a | a, b, c | c, c]`。 - **circular**: 将输入视为循环结构来进行填充。例如,对于序列 `[a, b, c]`,循环后的序列为 `[c, b | a, b, c | a, b]`。 #### 示例代码展示不同 `padding_mode` 下面是一个简单的 Python 代码片段,展示了四种不同的 `padding_mode` 如何影响转置卷积操作的结果: ```python import torch import torch.nn as nn input_tensor = torch.randn(1, 1, 5, 5) conv_transpose = { 'zeros': nn.ConvTranspose2d(1, 1, kernel_size=3, padding=1), 'reflect': nn.ConvTranspose2d(1, 1, kernel_size=3, padding=1, padding_mode='reflect'), 'replicate': nn.ConvTranspose2d(1, 1, kernel_size=3, padding=1, padding_mode='replicate'), 'circular': nn.ConvTranspose2d(1, 1, kernel_size=3, padding=1, padding_mode='circular') } for mode, layer in conv_transpose.items(): print(f"Output with {mode} padding:") output = layer(input_tensor) print(output.shape) ``` 上述代码创建了一个随机初始化的输入张量,并分别应用了带有不同 `padding_mode` 设置的 `ConvTranspose2d` 层。注意这里的输出形状相同,因为主要区别在于内部计算过程中使用的具体填充方法[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值