【PyTorch】教程:torch.nn.ConvTranspose2d

torch.nn.ConvTranspose2d是PyTorch中用于2D反卷积的模块,它常用于上采样操作。该模块接受输入通道、输出通道、卷积核大小等参数,并可以设置步长、填充和输出填充。输出尺寸可以通过不同的参数进行控制,如stride、padding、dilation和output_padding。文章通过示例展示了如何使用该模块并调整参数以得到期望的输出尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

torch.nn.ConvTranspose2d

CLASS torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1, padding_mode='zeros', device=None, dtype=None)

2D 反卷积;

该模块可以被视为 Conv2d 相对于其输入的梯度,也被称为分数跨步卷积或反卷积(尽管不是真正意义的反卷积,因为不计算卷积的真逆)。更多见 here 论文Deconvolutional Networks

参数

  • in_channels ([int]) – 输入通道数
  • out_channels ([int]) – 输出通道数
  • kernel_size ([int] or [tuple]) – 卷积核大小
  • stride ([int] or [tuple], optional ) – 步长,默认为1
  • padding ([int] or [tuple], optional ) – zero-padding添加到输入的每个维度上,默认为0
  • output_padding ([int] or [tuple], optional ) – 输出扩边,默认为0
  • groups ([int], optional ) – 组别数,默认为1
  • bias ([bool], optional ) – 如果为 True, 添加 bias 学习, 默认为 True
  • dilation ([int], [tuple], optional ) – kernel 元素之间的空格数,默认为1

shape

  • input: ( N , C i n , H i n , W i n ) (N, C_{in}, H_{in}, W_{in}) (N,Cin,Hin,Win) ( C i n , H i n , W i n ) (C_{in}, H_{in}, W_{in}) (Cin,Hin,Win)
  • output: ( N , C o u t , H o u t , W o u t ) (N, C_{out}, H_{out}, W_{out}) (N,Cout,Hout,Wout) ( C o u t , H o u t , W o u t ) (C_{out}, H_{out}, W_{out}) (Cout,Hout,Wout)

其中

H o u t = ( H i n − 1 ) ∗ s t r i d e [ 0 ] − 2 ∗ p a d d i n g [ 0 ] + d i l a t i o n [ 0 ] ∗ ( k e r n e l s i z e [ 0 ] − 1 ) + o u t p u t p a d d i n g [ 0 ] + 1 H_{out} = (H_{in}-1)*stride[0]-2*padding[0]+dilation[0]*(kernelsize[0]-1)+outputpadding[0]+1 Hout=(Hin1)stride[0]2padding[0]+dilation[0](kernelsize[0]1)+outputpadding[0]+1

W o u t = ( W i n − 1 ) ∗ s t r i d e [ 1 ] − 2 ∗ p a d d i n g [ 1 ] + d i l a t i o n [ 1 ] ∗ ( k e r n e l s i z e [ 1 ] − 1 ) + o u t p u t p a d d i n g [ 1 ] + 1 W_{out} = (W_{in}-1)*stride[1]-2*padding[1]+dilation[1]*(kernelsize[1]-1)+outputpadding[1]+1 Wout=(Win1)stride[1]2padding[1]+dilation[1](kernelsize[1]1)+outputpadding[1]+1

变量

  • weight ([Tensor]) – 模块的可学习的权重参数,( in_channels , out_channels groups , kernel_size[0] , kernel_size[1] ) \text{in\_channels}, \frac{\text{out\_channels}}{\text{groups}},\text{kernel\_size[0]}, \text{kernel\_size[1]}) in_channels,groupsout_channels,kernel_size[0],kernel_size[1]). 这些权重值采样来自于 U ( − k , k ) \mathcal{U}(-\sqrt{k}, \sqrt{k}) U(k ,k ) 其中, k = g r o u p s C out ∗ ∏ i = 0 1 kernel_size [ i ] k = \frac{groups}{C_\text{out} * \prod_{i=0}^{1}\text{kernel\_size}[i]} k=Couti=01kernel_size[i]groups
  • bias ([Tensor] ) – 模块的可学习的权重参数, U ( − k , k ) \mathcal{U}(-\sqrt{k}, \sqrt{k}) U(k ,k ), 其中 k = g r o u p s C out ∗ ∏ i = 0 1 kernel_size [ i ] k = \frac{groups}{C_\text{out} * \prod_{i=0}^{1}\text{kernel\_size}[i]} k=Couti=01kernel_size[i]groups
# torch.nn.ConvTranspose2d
import torch
import torch.nn as nn

# With square kernels and equal stride
m = nn.ConvTranspose2d(16, 33, 3, stride=2)
# non-square kernels and unequal stride and with padding
m = nn.ConvTranspose2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
input = torch.randn(20, 16, 50, 100)
output = m(input)
print("output.size: ", output.size()) # output.size:  torch.Size([20, 33, 93, 100])

# exact output size can be also specified as an argument
input = torch.randn(1, 16, 12, 12)
downsample = nn.Conv2d(16, 16, 3, stride=2, padding=1)
upsample = nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1)
h = downsample(input)
print("h.size(): ", h.size()) # h.size():  torch.Size([1, 16, 6, 6])

output = upsample(h, output_size=input.size())
print("output.size(): ", output.size()) # output.size():  torch.Size([1, 16, 12, 12]) 

【参考】

ConvTranspose2d — PyTorch 1.13 documentation

### 比较 `nn.AdaptiveAvgPool2d` 和 `nn.AvgPool2d` #### 特征 - **固定大小输出**:`nn.AdaptiveAvgPool2d` 可以自适应调整输入张量的空间维度到指定的输出尺寸。这意味着无论输入图像的具体空间分辨率如何,该操作都会将其转换成设定好的输出形状[^1]。 ```python adaptive_pool = nn.AdaptiveAvgPool2d(output_size=(5, 7)) input_tensor = torch.randn(1, 64, 8, 9) # 假设batch size为1,通道数为64 output_tensor = adaptive_pool(input_tensor) print(output_tensor.shape) # 输出将是 (1, 64, 5, 7) ``` - **预定义窗口滑动**:相比之下,`nn.AvgPool2d` 使用固定的内核大小和步幅来执行平均池化。这要求开发者提前知道并设置好这些参数,以便获得期望的结果[^2]。 ```python avg_pool = nn.AvgPool2d(kernel_size=3, stride=2, padding=1) input_tensor = torch.randn(1, 64, 10, 10) # 同样假设batch size为1,通道数为64 output_tensor = avg_pool(input_tensor) print(output_tensor.shape) # 结果取决于kernel_size、stride以及padding的选择 ``` #### 应用场景 - 对于那些需要灵活处理不同尺度特征图的任务来说,比如目标检测或多尺度分类器的设计中,`nn.AdaptiveAvgPool2d` 提供了一种方便的方式来自适应地获取统一的标准表征形式[^3]。 - 当训练过程中保持一致的感受野对于模型性能至关重要时,则更适合采用具有明确配置选项的传统方法——即通过精确控制`nn.AvgPool2d` 的超参(如 kernel 大小),可以更好地管理每一层的信息提取过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老周有AI~算法定制

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值