关于这里发布的答案,当我想使用方程来获取转置卷积的参数值时,我遇到了一些问题。例如,我有一个大小为 [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 image
或torch.Tensor
,-使用前者,如果输入大小动态变化,则使用后者,如果不是。
自适应池化,通常是AdaptiveAvgPool2d
,更复杂,它应该是架构的一部分。在网络开始时插入,它作为(批量)图像调整大小;没有魔法 - 它是通常实现的 CPU,很难在张量硬件上实现它。在嵌入式解决方案中,通常使用特殊的图像处理器来完成此类工作。
好吧,你仍然可以正式地用transposed_conv2d
解决任务,通过玩padding
,但它只是切断了图像的一部分,可能会丢失信息,或者插入很多无用的间距。