Разница Keras 'ZeroPadding2D в TensorFlow v1 и v2? - PullRequest
1 голос
/ 13 марта 2020

Я недавно закончил курс глубокого обучения в Coursera Эндрю Нг для Convolutional Networks. Последнее задание завершает распознавание лица. Я хочу перенести код из этого назначения, использующего TensorFlow 1.2.1, в последнюю версию (я использую TensorFlow 2.2.0).

Давайте рассмотрим следующий код из назначения с использованием tf 1.2.1:

  from keras.layers import Conv2D, ZeroPadding2D, Activation, Input, concatenate
  X_input = Input(input_shape)
  X = ZeroPadding2D((3, 3))(X_input)

, где input_shape = (3, 96, 96). Формы X_input и X следующие (выполняется с print в записной книжке Coursera):

(?, 3, 96, 96)   # shape of X_input
(?, 3, 102, 102) # shape of X

Однако, когда я пытаюсь запустить точно такой же код в моей записной книжке на Google Colab с tf 2.2.0 формы:

(None, 3, 96, 96)  # shape of X_input
(None, 9, 102, 96) # shape of X

Мне кажется, что ZeroPadding2D работает по-другому. Это правильно? Как я могу выполнить заполнение нулями, чтобы получить те же формы, что и в задании (не касаясь каналов)?

Спасибо!

РЕДАКТИРОВАТЬ: блок кода в моей личной записной книжке:

from tensorflow import keras
from tensorflow.keras.layers import Input, Conv2D, MaxPool2D, AveragePooling2D, ZeroPadding2D, BatchNormalization, Activation, Dense, Lambda

X_input = Input(input_shape)
print(X_input.shape)
X = ZeroPadding2D((3, 3))(X_input)
print(X.shape)

1 Ответ

0 голосов
/ 16 марта 2020

Замена кода,

X = ZeroPadding2D((3, 3))(X_input)

на

X = ZeroPadding2D(padding = ((3, 3), (3,3)), data_format='channels_first')(X_input)

даст вам ожидаемые результаты.

Полный рабочий код показан ниже:

from tensorflow import keras
from tensorflow.keras.layers import Input, Conv2D, MaxPool2D, AveragePooling2D, ZeroPadding2D, BatchNormalization, Activation, Dense, Lambda
input_shape = (3, 96, 96)
X_input = Input(input_shape)
print(X_input.shape)
X = ZeroPadding2D(padding = ((3, 3), (3,3)), data_format='channels_first')(X_input)
print(X.shape)
...