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