nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)
nn.ConvTranspose2d
是 PyTorch 中的转置卷积(Transposed Convolution)层,也称为反卷积(Deconvolution)或分数步长卷积(Fractionally Strided Convolution)。它的主要作用是上采样(Upsampling),即将输入特征图的尺寸放大,常用于图像分割(如U-Net)、生成对抗网络(GAN)等任务。
1. 核心参数
nn.ConvTranspose2d(
in_channels, # 输入通道数
out_channels, # 输出通道数
kernel_size=2, # 卷积核大小(默认2)
stride=2, # 步长(默认2)
padding=0, # 填充(默认0)
output_padding=0, # 输出填充(默认0)
bias=True # 是否使用偏置项
)
2. 工作原理
(1) 数学公式
转置卷积的输出尺寸计算公式:
当
kernel_size=2, stride=2, padding=0
时:输入尺寸放大2倍(如
(64,64)→(128,128)
)。
(2) 计算过程示例
假设输入为 1x1x3x3
((batch, channel, height, width)
),kernel_size=2, stride=2
:
输入:
3x3
的特征图。操作:
在每个像素间插入
stride-1=1
个零(间隔填充)。用
2x2
的卷积核滑动计算。
输出:
6x6
的特征图(放大2倍)。
图示:
输入 (3x3) 插零后 (5x5) 卷积输出 (6x6)
1 2 3 1 0 2 0 3 a b c d e f
4 5 6 → 0 0 0 0 0 → g h i j k l
7 8 9 4 0 5 0 6 m n o p q r
0 0 0 0 0 s t u v w x
7 0 8 0 9 y z A B C D
(实际输出值取决于卷积核权重。)
3. 主要用途
上采样(Upsampling):
替代
nn.Upsample
,可学习的放大方式(比插值更灵活)。例如:在U-Net中恢复特征图分辨率。
生成高分辨率图像:
GAN中的生成器(如DCGAN)用转置卷积从噪声生成图像。
低维特征映射到高维空间:
自编码器(Autoencoder)的解码部分。
4. 与普通卷积的区别
5. 参数选择建议
放大倍数:
若需放大2倍,用
kernel_size=2, stride=2
。若需放大4倍,可以堆叠两个转置卷积层。
避免棋盘伪影(Checkerboard Artifacts):
问题:当
kernel_size
不能被stride
整除时,输出可能出现棋盘状不均匀。解决:改用
kernel_size=4, stride=2, padding=1
或nn.Upsample + nn.Conv2d
。
输出尺寸控制:
用
output_padding
调整尺寸(当stride > 1
时可能需要)。
6. 代码示例
(1) 基础用法
import torch
import torch.nn as nn
# 定义转置卷积层
deconv = nn.ConvTranspose2d(
in_channels=64,
out_channels=32,
kernel_size=2,
stride=2
)
# 输入:(batch, channels, height, width)
x = torch.randn(1, 64, 32, 32) # 1x64x32x32
output = deconv(x) # 输出:1x32x64x64
print(output.shape) # torch.Size([1, 32, 64, 64])
(2) 与普通卷积对比
# 普通卷积(下采样)
conv = nn.Conv2d(64, 32, kernel_size=3, stride=2, padding=1)
y = conv(x) # 1x64x32x32 → 1x32x16x16
# 转置卷积(上采样)
deconv = nn.ConvTranspose2d(32, 64, kernel_size=2, stride=2)
z = deconv(y) # 1x32x16x16 → 1x64x32x32
7. 总结
功能:
nn.ConvTranspose2d
通过插零和卷积实现上采样。典型参数:
kernel_size=2, stride=2
可放大2倍。应用场景:图像分割、GAN、自编码器等需要放大特征图的模型。
注意事项:避免棋盘伪影,合理选择
kernel_size
和stride
。