Ошибка сверточного декодера автоматического кодера в Keras - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь настроить сверточный автокодер для воссоздания изображений с разрешением 80X130

Я добавил все необходимые операции импорта и записываю его в python 3.7

Это ошибка, которую я получаю:

Traceback (последний последний вызов):

Файл "CAED_Keras.py", строка 52, in ", строка 52, validation_data = (x_train, x_train)), вписывается

Файл "C: \ Python37 \ lib \ site-packages \ keras \ engine \ training.py", строка 1154, вписывается в _standardize_user_data batch_size = batch_size )

Файл "C: \ Python37 \ lib \ site-packages \ keras \ engine \ training.py", строка 621, e 145, в standardize_input_data в _standardize_user_data exception_prefix = 'target'), 76, 1) но получил массив с формой (1, 80, 130)

Файл "C: \ Python37 \ lib \ site-packages \ keras \ engine \ training_utils.py", строка 145, в строке standardize_input_data str (data_shape))

ValueError: Ошибка при проверке цели: ожидалось, что conv2d_7 будет иметь форму (4, 76, 1), но получил массив с sha pe (1, 80, 130)

Вот мой код:

input_img = Input(shape=(80, 130, 1)) 

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
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)

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='adadelta', loss='binary_crossentropy')

#Load Data
x_train = np.copy(lt.mel_spect_out[:int(len(lt.mel_spect_out)/10*9)])
x_test = np.copy(lt.mel_spect_out[int(len(lt.mel_spect_out)/10*9):])

#normalize
x_train = x_train / 255.
x_test = x_test / 255.


x_train = np.reshape(x_train, (len(x_train), 80, 130, 1))  
x_test = np.reshape(x_test, (len(x_test), 80, 130, 1))  

autoencoder.fit(x_train, x_train,
            epochs=50,
            batch_size=30,
            shuffle=True,
            validation_data=(x_train, x_train))

1 Ответ

0 голосов
/ 27 февраля 2020

У вас есть несколько проблем:

Архитектура сети

Я изменил несколько вещей: во-первых, я добавил слой UpSampling после закодированного и удалил последний, чтобы сохранить симметрию. Затем я добавил padding='same' к последнему слою конвенций из 16 фильтров, чтобы предотвратить обрезку ваших данных.

Вот код результата:

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
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)

x = UpSampling2D((2, 2))(encoded)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
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', padding='same')(x)
decoded = Conv2D(1, (3, 3), activation='relu', padding='same')(x)

Форма ввода

Проблема здесь в том, что вы хотите уменьшить выборку данных 3 раза.

Нет проблем для первого измерения: 80 % 2^3 = 0.

Но для второго: 130 % 2^3 = 2, это проблематично c.

Что вы можете сделать?

  • Вы можете обрезать высоту ваших изображений до 128
  • У меня нет другой идеи на данный момент

Одна последняя заметка

Вы использовали

validation_data=(x_train, x_train)
...