在学习FCN的过程中,用到了Conv2DTranspose,在此给出其计算公式。
对于Conv2D(此处不再考虑卷积核数,即参数filters,因为设为多少,输出就是多少),
输入图片矩阵为:WxW
卷积核大小,kernel_size:FxF
步长strides:S
边界扩充padding的值:P
则,输出大小N: N = ( W − F + 2 P ) / S + 1 N=(W-F+2P)/S+1 N=(W−F+2P)/S+1
如上,逆运算可得
输入图片矩阵为:NxN
卷积核大小,kernel_size:FxF
步长strides:S
边界扩充padding的值:P
则,输出大小W: W = ( N − 1 ) ∗ S − 2 P + F W=(N-1)*S-2P+F W=(N−1)∗S−2P+F
举个栗子,原大小为 X X X,FCN5层池化后为 X / 32 X/32 X/32,可以使用下式恢复原来大小: ( X / 32 − 1 ) ∗ 32 + 32 (X/32-1)*32+32 (X/32−1)∗32+32,即设卷积核大小和步长为32,padding为0 。
此部分的源码可以参考:..\Anaconda3\Lib\site-packages\keras\utils\conv_utils.py
。