我需要从图层input = HxWxn1
进行(上采样),其中H:高度,W:宽度和n1:过滤器数量,到层output = 2Hx2Wxn2
,其中2H = 2 *高度等和n2=n1/2
:新过滤器的数量。实现此目的的一种方法是使用转置卷积运算符。然而,众所周知,反卷积(转置卷积)算子可以导致checkerboard artifacts。克服此问题的一种方法是执行调整大小,然后应用卷积映射。例如。
output = transpose_conv2d(input,n2,kernel!=(1,1),stride!=1)
vs
output = resize(input) # e.g. bilinear interpolation
output = conv2d(output,n2,kernel=(1,1),stride=1)
显然,在第二种情况下,我们只是改变了过滤器的数量,而且我们不会学习"任何功能(我们不会总结来自input
图层的信息)。但这可以通过内核大小kernel!= 1
的另一个卷积来解决。 E.g。
output = resize(input)
output = conv2d(output,n2,kernel=(1,1),stride=1)
# appropriate padding
output = conv2d(output, n2, kernel != (1,1), ...)
两种上采样方法之间是否存在实际差异(除计算复杂性外)?我知道后者解决了棋盘格的问题。