求解转置Conv2D的扩展以查找其参数的问题



关于这里发布的答案,当我想使用方程来获取转置卷积的参数值时,我遇到了一些问题。例如,我有一个大小为 [16, 256, 16, 160, 160] 的张量,我想将其上采样为 [16, 256, 16, 224, 224]。基于转置卷积的方程,当求解高度方程时,我选择 stride+2 并且我想找到 k(核大小),我有以下等式,核大小将具有较大的负值。

224 = (160 - 2)x (2) + 1x(k - 1) + 1

我的计算有什么问题以及如何找到参数。

我不认为你错误地应用了公式,我认为这主要是你想要的输入和输出维度的问题

,这在stride=2

转置或拨号卷积可以非常快速地扩展输出。例如,假设您只是将这些参数用于转置卷积(我将这里的值简化为 1D 只是为了让计算清晰):

Input Size = 160
Stride = 2
Kernel = 1
Padding = 0
Output Padding = 0

现在我们应用官方文档中的公式来计算输出形状:

H_out =(H_in − 1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1

或者我们可以稍微简化公式:

Output Size = ((Input Size - 1) * Strides) - (2 * Padding) + Filter_Size + Ouput Padding

在这里,Filter_Size = dilation_factor* (kernel_size-1)使公式看起来不那么可怕。

现在,让我们以我们的示例为例,并将值放入其中,看看我们可以使用尽可能stride=2和最小的内核大小(即kernel=1)获得的转置 OUtput 大小

Ouput_Size = ((160-1)*2) - (2*0) + 1*(1-1) + 0
Output_Size = 318 - 0 + 0 + 0
Output_Size = 318

因此,以您想要的步伐,您至少会有一个output_size >= 318并且您想要224因此是负kernel_size

我希望这能回答你的问题。

参考链接,以更好地理解转置卷积计算,例如:

论文空间:上采样图像的转置卷积解释

计算卷积和转置卷积的输出大小

这个问题没有很好的建设性答案。

在某种意义上与conv2d相反, 将图像下采样stride倍,transposed_conv2d上采样stride倍。不能将其用于任意resize并获得均匀良好的结果,为此有torchvision.transforms.Resize或自适应池化。

torchvision.transforms.Resize是默认选择,它简单灵活,可以馈送PIL imagetorch.Tensor,-使用前者,如果输入大小动态变化,则使用后者,如果不是。

自适应池化,通常是AdaptiveAvgPool2d,更复杂,它应该是架构的一部分。在网络开始时插入,它作为(批量)图像调整大小;没有魔法 - 它是通常实现的 CPU,很难在张量硬件上实现它。在嵌入式解决方案中,通常使用特殊的图像处理器来完成此类工作。

好吧,你仍然可以正式地用transposed_conv2d解决任务,通过玩padding,但它只是切断了图像的一部分,可能会丢失信息,或者插入很多无用的间距。

最新更新