Получение ValueError в keras по неизвестной причине

#python #keras

#python #keras

Вопрос:

Я использую следующую модель keras

 input_profile = Input(shape=(23, 23, 1)) 
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_profile)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional

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_profile, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

X_GTEx = np.load('GTEx_X_float64.npy')
x_train = X_GTEx
x_train = np.reshape(x_train, (5207, 23, 23, 1))
from keras.callbacks import TensorBoard

autoencoder.fit(x_train, x_train,
                epochs=50, batch_size=127,
                shuffle=True, validation_data=(x_train, x_train),
                callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

  

И его запуск выдает следующую ошибку:

 ValueError: Error when checking target: expected conv2d_7 to have shape (20, 20, 1) but got array with shape (23, 23, 1)
  

Очевидно, что я ничего не установил с помощью shape (20,20,1) . Что не так с моей программой?

Комментарии:

1. Ошибки не приходят без причины 🙂

Ответ №1:

Длина каждого измерения ввода нечетна. Это приводит MaxPooling2D к тому, что слой сбрасывает тензор с floor помощью оператора.

В вашей модели с Input(shape=(23, 23, 1)) изменением размера тензора после каждого MaxPooling2D слоя будет 23 to 11 11 to 5 .

Затем два UpSampling слоя повышают дискретизацию (5, 5, 1) тензора до (20, 20, 1) , но модели нужен тензор с той же формой, что и входные данные.