Неверная форма ввода автоэнкодера Keras - PullRequest
1 голос
/ 04 июня 2019

Я собрал автоэнкодер CNN, используя керасы, и он отлично работал для набора тестовых данных MNIST. Я сейчас пробую это с другим набором данных, собранных из другого источника. Есть чистые изображения, и я должен прочитать их с помощью cv2, который работает нормально. Затем я преобразую эти изображения в массив, который, я думаю, снова работает нормально. Но когда я пытаюсь сделать метод .fit, это дает мне эту ошибку.

Error when checking target: expected conv2d_39 to have shape (100, 100, 1) but got array with shape (100, 100, 3)

Я попытался преобразовать изображения в оттенки серого, но затем они получили форму (100,100), а не (100,100,1), чего и хочет модель. Что я тут не так делаю?

Вот код, который я использую:

def read_in_images(path):
    images = []
    for files in os.listdir(path):
        img = cv2.imread(os.path.join(path, files))
        if img is not None:
            images.append(img)
    return images

train_images = read_in_images(train_path)
test_images = read_in_images(test_path)
x_train = np.array(train_images)
x_test = np.array(test_images) # (36, 100, 100, 3)

input_img = Input(shape=(100,100,3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)


x = Conv2D(16, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(168, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (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')


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

Модель отлично работает с набором данных MNIST, но не с моим собственным набором данных. Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Ваши входные и выходные формы различны.Это вызывает ошибку (я думаю).

decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

должно быть

decoded = Conv2D(num_channels, (3, 3), activation='sigmoid', padding='same')(x)
1 голос
/ 04 июня 2019

Я провел несколько тестов, и с данными, загруженными в градациях серого, вот так:

img = cv2.imread(os.path.join(path, files), 0)

затем увеличьте размер окончательного загруженного массива, как:

x_train = np.expand_dims(x_train, -1)

, и, наконец, нормализуем васданные с простым:

x_train = x_train / 255.

(ввод вашей модели должен быть: input_img = Input(shape=(100, 100, 1))

Потеря снова становится нормальной, и модель работает хорошо!

ОБНОВЛЕНИЕ после комментария

Чтобы сохранить все каналы rgb через сеть, вам нужен выход, соответствующий вашей форме ввода.
Здесь, если вы хотите изображение с формой (100, 100, 3), вынужен вывод (100, 100, 3) из вашего декодера.

decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x) уменьшит вывод, чтобы иметь форму (100, 100, 1)

Так что вам просто нужночтобы изменить количество фильтров, здесь мы хотим 3 канала цвета, поэтому значение должно быть таким:

decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...