Слой Deconvolution2D в керасе

этот слой не очень хорошо документирован, и у меня возникли проблемы с тем, как его использовать.
Я пытаюсь что-то вроде:

input_img = Input(shape=(1, h, w))
x = Convolution2D(16, 7, 7, activation='relu', border_mode='valid')(input_img)
d = Deconvolution2D(1, 7, 7, (None, 1, 2*h, 2*w))
x = d(x)

но когда я пытаюсь написать d.output_shape, Я получаю исходную форму изображения вместо вдвое большего размера (это то, что я ожидал).
Любая помощь будет очень признательна!

1 ответов


короткий ответ: вам нужно добавить subsample=(2,2) в Deconvolution2D, если вы хотите, чтобы выход действительно был в два раза больше, чем вход.


более длинный ответ: Deconvolution2D строго недокументирован, и вам нужно пройти его код, чтобы понять, как его использовать.

во-первых, вы должны понять, как работает слой деконволюции (пропустите это, если вы уже знаете все детали). Деконволюция, в отличие от того, что предлагает ее название, просто применяет обратную пропгацию (метод вычисления градиента) стандартного сверточного слоя на входе в слой деконволюции. "Размер ядра" слоя деконволюции фактически является размером ядра виртуального слоя свертки шага backprop, упомянутого выше. Хотя, учитывая размер ядра свертки и его шаг, легко вычислить выходную форму слоя свертки (предполагая, что это не заполнение (входное ядро) // Шаг + 1), но обратное неверно. На самом деле, может быть больше чем одна возможная входная форма, которая соответствует заданной выходной форме слоя свертки (это связано с тем, что целочисленное деление не обратимо). Это означает, что для слоя деконволюции выходная форма не может быть напрямую определена просто из входной формы (которая неявно известна), размера ядра и шага - вот почему нам нужно знать выходную форму при инициализации слоя. Конечно, из-за того, как определен слой деконволюции, для некоторых входных фигур вы получите отверстия в его выход, который не определен, и если мы запрещаем эти случаи, то мы на самом деле можете вывести форму вывода.

вернемся к Keras и как это реализовано. Смутно, параметр output_shape фактически не используется для определения выходной формы слоя, и вместо этого они пытаются вывести его из ввода, размера ядра и шага, предполагая, что предоставляются только допустимые output_shapes (хотя это не проверено в коде). Этот сам output_shape используется только как вход для шага backprop. Таким образом, вы также должны указать параметр stride (подвыбор в Keras), чтобы получить желаемый результат (который мог быть определен Keras из заданной входной формы, выходной формы и размера ядра).