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