图解“逆卷积”操作(分步卷积)——基于torch.nn.ConvTranspose2d( )

本篇文章不涉及十分复杂的数学公式,仅以形象的方式帮助大家理解“逆卷积”的计算过程,请各位看官放心实用。

什么是逆卷积?
相信在很多论文或者具体模型中我们都曾经碰见过ConvTranspose,其经常出现在需要进行上采样的地方,通俗来讲,就是需要进行特征恢复或者图像扩大的地方。而之所以称其为“逆卷积”,是因为该方法进行上采样的方式与卷积操作互为“逆过程”。

常见误区:逆卷积就是将卷积复原
上面的这种说法事实上是错误的,事实上受到卷积操作权重的影响,我们不能确定原来的特征值在卷积域内的分布情况。如下图所示:在已知卷积(kernel 3*3)之后得到值为1,那么逆卷积之后一定能够恢复到最原始的状态码?(需要注意,Conv2d与ConvTranspose2d不是同一个模块的顺序与逆转操作,而是分别的两个模块)
答案显然是不能够完全恢复,仅仅是区域恢复
在这里插入图片描述
torch.nn.ConvTranspose2d()参数列表:(以下内容拷贝自官方文档)

  • in_channels (int) – Number of channels in the input image

  • out_channels (int) – Number of channels produced by the convolution

  • kernel_size (int or tuple) – Size of the convolving kernel

  • stride (int or tuple, optional) – Stride of the convolution. Default: 1

  • padding (int or tuple, optional) – dilation * (kernel_size - 1) - padding zero-padding will be added to both sides of each dimension in the input. Default: 0

  • output_padding (int or tuple, optional) – Additional size added to one side of each dimension in the output shape. Default: 0

  • groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1

  • bias (bool, optional) – If True, adds a learnable bias to the output. Default: True

  • dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1

乍一看之下我们可能会觉得该模型的参数与nn.torch.Conv2d简直一摸一样,那么事实上呢?实验可以证明,部分同名参数之间的意义是存在差异的,体现在paddingstride上。

padding:
或许有些比较灵光的同学在看完官方文档中的介绍之后就已经知道是怎么一回事了,但我相信大部分同学都和我一样:似懂非懂。不着急,下面让我们具体来看看:
首先我们摘取文档中的一句话:dilation * (kernel_size - 1) - padding zero-padding will be added to both sides of each dimension in the input,表面上看这句话的意义十分明显,此处的padding与Conv2d中的不同,并非直接在图像周围直接添加对应值的padding,而是通过一个简单的公式进行计算得到。下面我们通过一组图来对padding进行说明:
一个55的输入,padding=0,stride=1时,输出为图中的橙色框大小33.那么如果我们想要将橙色框重新恢复为灰色框,那么橙色框的padding应该取多少呢?
在这里插入图片描述
容易想见:当我们取padding=2时,同样以3 * 3的kernel进行卷积操作时,我们能够恢复出5 * 5的输入。此时padding=dilation*(kernel_size - 1)= 2,完全正确。
在这里插入图片描述
以更加严谨的方式进行阐述:

  • 当卷积操作的padding=0时,我们称这种卷积为‘valid’卷积,结果是输出尺寸相较输入减小,而为了进行恢复,我们则需要在输出中添加padding。
  • 当卷积操作的padding=dalition*(kernel_size - 1)时,我们称这种卷积为‘full’卷积,结果是输出尺寸较输入尺寸更大,为了进行恢复,我们无需再添加padding。
  • 其他介于两者之间的情况,类推即可。

stride:
逆卷积操作中的stride不再是卷积操作中的kernel的移动步幅,而是指像素之间的间距,下面我们同样以一组图像来进行说明:
如下图中所示,当输入为5 * 5,kernel_size=3,padding=0,stride=2时,我们最终得到的是一个2 * 2的输出(此图中并未进行拼接),那么为了进行恢复原图像,我们需要做什么呢?
在这里插入图片描述
我们首先扩大各像素之间的距离为stride=2,如图中蓝色线所示,表明交原像素进行分隔。此时输入由2 * 2重新转变为3 * 3,接下来便与上面的逆卷积操作相同:添加padding,并进行卷积恢复。这也是为什么逆卷积也叫做“分步卷积”的原因。
在这里插入图片描述
小结:
以上即为本篇文章的全部内容,本文试图通过更为生动的方式向各位解释ConvTranspose2d中各参数的实际意义,帮助大家更好地理解逆卷积操作的实际计算过程。可以发现,逆卷积并不是完全对等的恢复操作,更强调图像大小的复原,而其中最为关键的两个参数即为padding以及stride,其实际意义与卷积操作的同名参数存在差异,需要格外注意。下面再贴出一段官方文档中的示例:

input = torch.randn(20, 16, 50, 100)
output = m(input)
# 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)
h.size()
>>> torch.Size([1, 16, 6, 6])
output = upsample(h, output_size=input.size())
output.size()
>>> torch.Size([1, 16, 12, 12])

可以发现,在实际的使用中,直接将Conv2d以及ConvTranspose2d中的padding,stride参数设置为相等,就能够完成图像尺寸的复原操作。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
torch.nn.ConvTranspose2d是PyTorch中的一个函数,用于执行二维转置卷积操作。它具有多个参数,包括输入通道数(in_channels)、输出通道数(out_channels)、卷积核大小(kernel_size)、步长(stride)、填充(padding)、输出填充(output_padding)等等。你可以在官方文档中找到更详细的参数介绍和函数用法。 需要注意的是,torch.nn.ConvTranspose2dtorch.nn.Conv2d默认的权重排布方式是不同的。在进行反卷积操作之前,需要对权重进行重新排布,然后再进行常规的卷积操作。你可以通过一些函数来实现将反卷积操作转换为插值和卷积两步操作的方式。 具体操作流程如下: 1. 进行插值操作(根据需要进行插值,可以选择不进行插值操作) 2. 执行卷积操作(使用转置后的权重进行卷积) 3. 如果需要,可以将反卷积转换为卷积操作,重新排布权重,然后进行常规的卷积操作。 你可以参考上述代码示例来进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [反卷积torch.nn.ConvTranspose2d详解(含转换成卷积运算的代码示例)](https://blog.csdn.net/cc__cc__/article/details/121444692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值