HG
Published on 2025-04-24 / 16 Visits
0
0

U-net中的反卷积

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

  1. 输入3x3 的特征图。

  2. 操作

    • 在每个像素间插入 stride-1=1 个零(间隔填充)。

    • 2x2 的卷积核滑动计算。

  3. 输出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. 主要用途

  1. 上采样(Upsampling)

    • 替代 nn.Upsample,可学习的放大方式(比插值更灵活)。

    • 例如:在U-Net中恢复特征图分辨率。

  2. 生成高分辨率图像

    • GAN中的生成器(如DCGAN)用转置卷积从噪声生成图像。

  3. 低维特征映射到高维空间

    • 自编码器(Autoencoder)的解码部分。


4. 与普通卷积的区别

特性

普通卷积 (nn.Conv2d)

转置卷积 (nn.ConvTranspose2d)

作用

下采样(缩小尺寸)

上采样(放大尺寸)

输入输出关系

H_out = (H_in + 2p - k) // s + 1

H_out = (H_in - 1)*s + k - 2p

典型参数

k=3, s=1, p=1(保持尺寸)

k=2, s=2, p=0(放大2倍)

计算方式

滑动窗口加权求和

插零后卷积


5. 参数选择建议

  1. 放大倍数

    • 若需放大2倍,用 kernel_size=2, stride=2

    • 若需放大4倍,可以堆叠两个转置卷积层。

  2. 避免棋盘伪影(Checkerboard Artifacts)

    • 问题:当 kernel_size 不能被 stride 整除时,输出可能出现棋盘状不均匀。

    • 解决:改用 kernel_size=4, stride=2, padding=1nn.Upsample + nn.Conv2d

  3. 输出尺寸控制

    • 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_sizestride


Comment