Невозможно установить выходной размер Conv2D в keras

Сейчас я изучаю AutoEncoder с CNN. Для изучения я создал модель для данных MNIST. Но я не смог правильно настроить выходной диммер Conv2d. Пожалуйста, смотрите изображение модели ниже. Хотя я ожидаю, что первый вывод Conv2d должен быть (None, 16, 28, 28), фактический вывод (None, 1, 28, 16). Что касается документа, мой код выглядит неплохо. https://keras.io/layers/convolutional/#conv2d

Не могли бы вы найти какие-либо ошибки в моем коде?

Моя среда

  • Питон 3.6.0
  • keras 2.0.2 (бэкенд — Tensorflow)

Код

from keras.layers import Input, Convolution2D, MaxPool2D, UpSampling2D, Conv2D
from keras.models import Model
input_img = Input(shape=(1, 28, 28))
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPool2D((2,2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPool2D((2,2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPool2D((2,2), padding='same')(x)

x = Conv2D(8, (3,3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2,2))(x)
x = Conv2D(8, (3,3), activation='relu', padding='same')(x)
x = UpSampling2D((2,2))(x)
x = Conv2D(16, (3,3), activation='relu')(x)
x = UpSampling2D((2,2))(x)
decoded = Conv2D(1, (3,3), activation='sigmoid', padding='same')(x)

autoencoder= Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

from keras.utils import plot_model
plot_model(autoencoder, to_file="architecture.png", show_shapes=True)

введите здесь описание изображения

Обновлено

Я добавил autoencoder.summary(). Итак, мой вопрос: почему первый выход CNN не стал (None, 16, 28, 28)? (None, 1, 28, 16) это не мое ожидание.

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_181 (Conv2D)          (None, 1, 28, 16)         4048      
_________________________________________________________________
max_pooling2d_82 (MaxPooling (None, 1, 14, 16)         0         
_________________________________________________________________
conv2d_182 (Conv2D)          (None, 1, 14, 8)          1160      
_________________________________________________________________
max_pooling2d_83 (MaxPooling (None, 1, 7, 8)           0         
_________________________________________________________________
conv2d_183 (Conv2D)          (None, 1, 7, 8)           584       
_________________________________________________________________
max_pooling2d_84 (MaxPooling (None, 1, 4, 8)           0         
_________________________________________________________________
conv2d_184 (Conv2D)          (None, 1, 4, 8)           584       
_________________________________________________________________
up_sampling2d_72 (UpSampling (None, 2, 8, 8)           0         
_________________________________________________________________
conv2d_185 (Conv2D)          (None, 2, 8, 8)           584       
_________________________________________________________________
up_sampling2d_73 (UpSampling (None, 4, 16, 8)          0         
_________________________________________________________________
conv2d_186 (Conv2D)          (None, 4, 16, 16)         1168      

_________________________________________________________________
up_sampling2d_74 (UpSampling (None, 8, 32, 16)         0         
_________________________________________________________________
conv2d_187 (Conv2D)          (None, 8, 32, 1)          145       
=================================================================
Total params: 8,273.0
Trainable params: 8,273.0
Non-trainable params: 0.0
_________________________________________________________________

Обновлено2

Мой input_img предназначен для Theano. Поэтому я должен измениться, как показано ниже. В противном случае я изменил image_dim_ordering на ~/.keras/keras.json

# Theano style
input_img = Input(shape=(1, 28, 28))

# Tensorflow style
input_img = Input(shape=(28, 28, 1))

person jef    schedule 25.04.2017    source источник
comment
попробуйте использовать autoencoder.summary(), это распечатает всю информацию о выходной форме для каждого слоя в терминале и посмотрите, есть ли другой результат (или добавьте его к вашему вопросу).   -  person Dr. Snoopy    schedule 25.04.2017
comment
Я добавил резюме и уточнил свой вопрос   -  person jef    schedule 25.04.2017


Ответы (1)


Это очень распространенная проблема с упорядочением изображений. Theano помещает измерение каналов во второй элемент массива фигур, например (samples, channels, width, height), а TensorFlow помещает измерения каналов в конец, например (samples, width, height, channels). Вы используете упорядочение Theano, но бэкэнд — Tensorflow.

Просто измените формы, чтобы они соответствовали правильному порядку, и все должно работать. В качестве альтернативы вы можете изменить image_dim_ordering на «th» в вашем ~/.keras/keras.json файле.

person Dr. Snoopy    schedule 25.04.2017