Расчет выхода после свертки и транспонирования свертки - PullRequest
2 голосов
/ 10 марта 2020

Я просматривал исследовательскую работу, чтобы понять ГАН . Поскольку я недавно изучал CNNs , я хотел определить выходную форму на каждом шаге после convolution, а затем после transpose convolution. На следующем изображении описана Генераторная сеть , о которой упоминается в документе:

image

Я знаю, что формула для расчета Выходная форма после свертки:

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

Для расчета формы транспонированной свертки я сослался на этот ответ .

. Ниже приведен код, который я использовал для вычисления выходных форм:

# 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) .

...