注意:tensorflow是指定了output_shape的,但是keras的output是计算出来的,所以keras的具体输出形状还是得打印出来看了才能知道,或者自己到相应的计算函数中查看。
tensorflow反卷积是如何实现的?
卷积的输出尺寸:
tensorflow官方是这么写的,
其中,VALID时的padding数为:
如果p为奇数就是左奇右偶填充。
反卷积判断输出尺寸是否正确也可以根据以上卷积的公式进行计算,只不过输入输出要互换。
另一点需要注意的点反卷积的filter尺寸输入输出要互换。即卷积[h,w,in,out]反卷积[h,w,out,in]
要想我们按照这种方法求得的结果和输入tf.nn.conv2d_transpose()函数的结果是一样的,需要对卷积核翻转180。
问题:反卷积的时候padding方式不同,具体是如何实现的?以及如何crop的问题
因为网上大多数是针对padding=SAME的情况,而padding=VALID的情况没有找到很好的解释。
经过一天的实验,总结以下
在input之间补s-1个0,再在最外圈补f-1圈0.
SAME时,从output裁剪处output大小的矩阵来,而VALID时,如果输出的矩阵比要求的小,需要在最后一列和最后一行补0。
(一般情况下VALID的输出矩阵会比SAME的要大)
而以上的这些烦恼在pytorch中就不复存在了。pytorch大法好!
nn.ConvTranspose2d(self, in_channels, out_channels, kernel_size, stride=1,
padding=0, outputpadding=0, groups=1, bias=True, dilation=1)
输出直接可以根据公式求得,还不会出现tensorflow里那种输出尺寸可能会不确定所以必须得指定output_shape。