卷积和转置卷积后计算输出

时间:2020-03-10 10:21:44

标签: python conv-neural-network deconvolution generative-adversarial-network

我正在阅读一份研究论文,以了解 GANs 。正如我最近研究了 CNN 一样,我想确定在convolution之后然后在transpose convolution之后的每个步骤中的输出形状。下图描述了本文提到的 Generator网络

Image

我知道卷积后计算输出形状的公式是:

O = (W - K - 2*P)/S + 1

为计算转置卷积的形状,我参考了此answer

以下是我用来计算输出形状的代码:

# h -> height
# w -> width
# k_h -> kernel height
# k_w -> kernel width
# pad_h -> padding height
# pad_w -> padding width
# s_h -> stride height
# s_w -> stride width
# n_f -> number of filters
def conv2d(h, w, k_h, k_w, pad, s_h, s_w, n_f):
    out_h = math.floor((h - k_h + 2*pad)/s_h) + 1
    out_w = math.floor((w - k_w + 2*pad)/s_w) + 1
    
    print("In (h, w) : ({0}, {1}) -conv2d-> ({2}, {3}, {4})".format(h, w, out_h, out_w, n_f))
    return out_h, out_w 

def conv2dTrans(h, w, k_h, k_w, s_h, s_w, n_f):
    pad_h = math.ceil((s_h*(h - 1) + k_h - h*s_h)/2)
    pad_w = math.ceil((s_w*(w - 1) + k_w - w*s_w)/2)
    
    print("Padding (h, w) : ({0}, {1})".format(pad_h, pad_w))
    
    # out_dim = strides * (in_dim - 1) + kernel_size - 2 * padding
    out_h = ((s_h*(h - 1) + k_h - 2*pad_h))
    out_w = ((s_w*(w - 1) + k_w - 2*pad_w))
    
    print("In (h, w) : ({0}, {1}) -conv2dTranspose-> ({2}, {3}, {4})".format(h, w, out_h, out_w, n_f))
    return out_h, out_w

# Convolution
h, w = conv2d(256, 256, 7, 7, 0, 1, 1, 128)
h, w = conv2d(h, w, 3, 3, 0, 2, 2, 128)
..... and so on
# Transpose Convolution
h, w = conv2dTrans(h, w, 3, 3, 2, 2, 128)
..... and so on

我已经按照图像中给出的顺序调用了函数,但是生成器网络的输出形状不等于输入形状 (256 ,256)

0 个答案:

没有答案