Обучение автоэнкодеру на моих данных с использованием Keras - PullRequest
0 голосов
/ 23 января 2019

У меня есть авто-кодер, написанный на Керасе, как показано ниже.Однако у меня появляется следующая ошибка:

ValueError: Error when checking model input: the list of Numpy arrays
that you are passing to your model is not the size the model expected. 
Expected to see 1 arrays but instead got the following list of 374 arrays

при условии, что 374 - это число моих тренировочных образов.

Как я могу обучить автоэнкодеру на моих данных в этом случае?

from keras.layers import Input, Dense
from keras.models import Model
import os

training_directory = '/training'
testing_directory ='/validation'
results_directory = '/results'
training_images = []
validation_images = []

# the size of the encoded represenatation
encoding_dimension = 4096
# input placeholder
input_image = Input(shape=(262144,))
# the encoded representation of the input
encoded = Dense(encoding_dimension,activation='relu')(input_image)
# reconstruction of the input (lossy)
decoded = Dense(262144,activation='sigmoid')(encoded)
# map the input image to its reconstruction
autoencoder = Model(input_image,decoded)

# encoder model
# map an input image to its encoded representation
encoder = Model(input_image,encoded)

# decoder model

# place holder fpr an encoded input
encoded_input = Input(shape=(encoding_dimension,))
# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# create the decoder model
decoder = Model(encoded_input,decoder_layer(encoded_input))

for root, dirs, files in os.walk(training_directory):
    for file in files:
        image = cv2.imread(root + '/' + file)
        training_images.append(image)

for root, dirs, files in os.walk(testing_directory):
    for file in files:
        image = cv2.imread(root + '/' + file)
        validation_images.append(image)

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

autoencoder.fit(training_images,epochs=10,batch_size=20,shuffle=True,validation_data=validation_images)

encoded_images = encoder.predict(validation_images)
decoded_images = decoder.predict(encoded_images)

Спасибо.

РЕДАКТИРОВАТЬ

Я добавил следующее вместо циклов for:

training_generator = ImageDataGenerator()
validation_generator = ImageDataGenerator()
training_images = training_generator.flow_from_directory(training_directory, class_mode='input')
validation_images = validation_generator.flow_from_directory(validation_directory, class_mode='input')

Но получил следующее:

TypeError: Error when checking model input: data should be a Numpy
array, or list/dict of Numpy arrays. Found
<keras.preprocessing.image.DirectoryIterator object at 0x2aff3a806650>...

, которое произошло с этим утверждением:

autoencoder.fit(
    training_images, 
    epochs=10, 
    batch_size=20, 
    shuffle=True,
    validation_data=validation_images)

Есть идеи?

1 Ответ

0 голосов
/ 23 января 2019

Несмотря на то, что у вас проблема с формой, я бы порекомендовал использовать функции предварительной обработки изображений Keras, в частности класс ImageDataGenerator :

keras.preprocessing.image.ImageDataGenerator : создание пакетов данных тензорного изображения с дополнением данных в реальном времени. Данные будут зациклены (в пакетах).

Это даст вам доступ к преобразованию, дополнению данных и другим полезным функциям для использования ваших данных. Для бита авто-кодировщика вам нужно:

img_gen.flow_from_directory(training_directory, ..., class_mode='input')

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

...