反卷积torch.nn.ConvTranspose2d详解(含转换成卷积运算的代码示例)

本文详细介绍了PyTorch中torch.nn.ConvTranspose2d的参数及使用方法,并通过实例讲解了如何获得新的特征图,包括插值和填充操作。此外,还提供了将反卷积转换为卷积操作的代码示例。

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

1.torch.nn.ConvTranspose2d参数介绍

官方文档:https://pytorch.org/docs/master/generated/torch.nn.ConvTranspose2d.html#torch.nn.ConvTranspose2d

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)

※反卷积可以认为先对feature map进行插值/padding操作得到新的feature map然后进行常规的卷积运算。实际转换过程中存在的细节问题下文会提及。

2.如何得到新的feature map
①s=1:不进行插值操作,只进行padding操作

H o u t = H i n + 2 ∗ p a d d i n g _ n e w s i z e     其 中 , p a d d i n g _ n e w s i z e = k e r n e l _ s i z e − p a d d i n g − 1 H_{out}=H_{in}+2*padding\_newsize \ \ \ 其中,padding\_newsize=kernel\_size-padding-1 Hout=Hin+2padding_newsize   ,padding_newsize=kernel_sizepadding1

②s>1:进行插值操作

1)在输入feature map的每2个像素之间增加(s-1)个0
2)在输入的底边和右边进行padding——(c+2p-k)mod(s),其中c的计算方式见下方。
3)最后根据公式进行外围的padding。

eg: i=3, k=3, p=1, s=2

普通卷积输出的计算方式: o u t p u t   f e a t u r e   m a p = ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ output\ feature\ map=\lfloor \frac{n+2p-f}{s}+ 1\rfloor×\lfloor \frac{n+2p-f}{s}+ 1\rfloor output feature map=sn+2pf+1×sn+2pf+1
同样地,计算反卷积的输出: 3 = ⌊ c + 2 ∗ 1 − 3 2 + 1 ⌋ → c = 5 , 6 3=\lfloor \frac{c+2*1-3}{2}+ 1\rfloor→c=5,6 3=2c+213+1c=5,6

  • 当c=5时,(5+2-3)mod(2)=0,∴第2)步无需填充
  • 而根据p’=k-p-1=1,则需要在feature map外围padding一圈,即可按照k’=3,s’=1进行卷积操作。
  • 上述操作依次如下图所示:

==============================================================

  • 当c=6时,(6+2-3)mod(2)=1,所以首先在底边和右边padding一行/列
  • 同样p’=1,再在上一步的基础上,在feature map外围padding一圈。
  • 上述操作依次如下图所示:

※torch.nn.ConvTranspose2d中的output_padding参数的设定为0或1就决定了c=5还是6。

3.执行卷积操作

整个过程满足: H i n = ( H o u t ∗ s − 2 ∗ p + k e r n e l _ s i z e ) , 其 中 H i n 为 目 标 尺 寸 , H o u t 为 原 始 尺 寸 H_{in}=(H_{out}*s - 2*p + kernel\_size),其中H_{in}为目标尺寸,H_{out}为原始尺寸 Hin=(Houts2p+kernel_size)HinHout

4.反卷积转换成卷积操作(代码示例)

1)插值操作

def interpolation(input, output_padding=0):    # padding use conv2d
    in_size = input.size()
    assert in_size[2]==in_size[3]
    inter_size = 2 * in_size[2] - 1
    output = torch.zeros(in_size[0], in_size[1], inter_size, inter_size)
    for i in range(in_size[0]):
        for j in range(in_size[1]):
            for m in range(in_size[2]):
                for n in range(in_size[3]):
                    output[i][j][2*m][2*n] = input[i][j][m][n]
    return output

2)卷积操作
※需要注意的是,torch.nn.ConvTranspose2d默认权重的排布方式和Conv2d是不同的,需要进行重新排布再进行常规的卷积操作。可以通过下方函数将反卷积操作转换为插值和卷积两步操作(这里的例子刚好没有底边和右边padding的情况)。

def compare_conv_deconv(input, weight, b, out):
    inter_input = interpolation(input)
    conv_wq = torch.flip(weight,dims=[2,3])
    conv_wq = conv_wq.transpose(0,1)
    test_out = torch.nn.functional.conv2d(inter_input, conv_wq, bias=b, stride=(1,1), padding=2, dilation=1, groups=1)  # kernel_size=4
    if out.equal(test_out):
        print("all results are correct!")
    return conv_wq, b

参考链接:https://blog.youkuaiyun.com/qq_41076797/article/details/114494990

### 关于反卷积代码实现 以下是基于 Python 和 TensorFlow 的反卷积(转置卷积代码示例。此代码展示了如何使用 `tf.nn.conv2d_transpose` 函数来执行反卷积操作。 ```python import tensorflow as tf # 定义输入张量 (batch_size, height, width, channels) input_tensor = tf.random.normal([1, 4, 4, 3]) # 定义过滤器形状 [height, width, output_channels, input_channels] filter_shape = [3, 3, 6, 3] # 创建随机初始化的权重矩阵 weights = tf.Variable(tf.random.truncated_normal(filter_shape, stddev=0.1)) # 输出张量的目标大小 (batch_size, new_height, new_width, output_channels) output_shape = [1, 8, 8, 6] # 执行反卷积操作 deconv_output = tf.nn.conv2d_transpose(input_tensor, weights, output_shape=output_shape, strides=[1, 2, 2, 1], padding='SAME') print("Input Tensor Shape:", input_tensor.shape) print("Output Tensor Shape after Deconvolution:", deconv_output.shape) ``` 上述代码实现了基本的反卷积操作,其中: - 输入张量是一个具有批量维度 `[1, 4, 4, 3]` 的四维张量。 - 过滤器定义了一个 `[3, 3, 6, 3]` 形状的卷积核。 - 使用 `strides=[1, 2, 2, 1]` 来指定步幅参数,这会使得输出的高度和宽度扩大两倍。 - 参数 `padding='SAME'` 表明填充方式为保持边界不变[^3]。 如果希望进一步了解反卷积的实际用途以及其在生成模型中的角色,则可以参考 GAN 网络的相关研究[^5]。 ### 反卷积的工作机制补充说明 需要注意的是,尽管术语上称为“反卷积”,但实际上它并不是传统意义上的逆运算。它的主要功能在于扩展空间维度并生成更高分辨率的数据,而不是精确恢复原始输入数据[^2]。 #### 注意事项 当设计反卷积层时,应特别注意以下几点: - **步幅设置**:决定了输出的空间尺寸增长比例。 - **填充模式**:影响最终输出边界的处理方式。 - **权重初始化**:良好的初始值有助于训练收敛速度加快。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值