Пустой вывод сверточного автоэнкодера Keras

Небольшой отказ от ответственности: я новичок в Keras, машинном обучении и программировании в целом.

Я пытаюсь создать базовый автокодер для (в настоящее время) одного изображения. Хотя кажется, что он работает нормально, на выходе получается просто белое изображение. Вот что у меня есть:

img_height, img_width = 128, 128

input_img = '4.jpg'
output_img = '5.jpg'

# load image
x = load_img(input_img)
x = img_to_array(x)  # array with shape (128, 128, 3)
x = x.reshape((1,) + x.shape)  # array with shape (1, 128, 128, 3)

# define input shape
input_shape = (img_height, img_width, 3)

model = Sequential()
# encoding
model.add(Conv2D(128, (3, 3), activation='relu', input_shape=input_shape, 
padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))

# decoding
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D(size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D(size=(2,2)))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(3, (3, 3), activation='sigmoid', padding='same'))

model.compile(loss='binary_crossentropy', optimizer='adam')
print(model.summary())

checkpoint = ModelCheckpoint("autoencoder-loss-{loss:.4f}.hdf5", monitor='loss', verbose=0, save_best_only=True, mode='min') 
model.fit(x, x, epochs=10, batch_size=1, verbose=1, callbacks=[checkpoint])

y = model.predict(x)

y = y[0, :, :, :]
y = array_to_img(y)
save_img(output_img, y)

Я просмотрел несколько руководств для справки, но до сих пор не могу понять, в чем моя проблема.

Будем очень признательны за любые рекомендации / предложения / помощь.

Спасибо!


person J Doug    schedule 30.11.2018    source источник


Ответы (1)


это решило проблему. Код просто отсутствовал

x = x.astype('float32') / 255.

Это встроенная функция numpy для преобразования значений, содержащихся в этом векторе, в числа с плавающей запятой.

Это позволяет нам получать десятичные значения, где значения делятся на 255. Значения RGB хранятся как 8-битные целые числа, поэтому мы делим значения в векторе на 255 (2 ^ 8-1), чтобы представить цвет в виде десятичного числа. значение от 0,0 до 1,0.

person Dipack    schedule 30.11.2018
comment
Это действительно полезно. Я предполагаю, что на самом деле я ищу то же изображение, что и на выходе. Для этого не похоже, что мне нужна какая-либо метка, так как вывод должен совпадать с вводом. Можете ли вы указать мне, как я могу это сделать? - person J Doug; 30.11.2018
comment
О, я вижу. Просматривая блог Keras, я нашел это руководство на сверточных автоэнкодерах. Возможно, это может быть то, что вы ищете? - person Dipack; 30.11.2018
comment
Этот учебник решил проблему (хотя я уже видел его около 1000 раз). Мне не хватало x = x.astype('float32') / 255., который нормализует значения пикселей между 0 и 1. Спасибо за помощь! - person J Doug; 30.11.2018
comment
Это потрясающе! Бит astype(..) - это встроенная функция numpy для преобразования значений, содержащихся в этом векторе, в числа с плавающей запятой. Это позволяет нам также получать десятичные значения, когда значения затем делятся на 255. Значения RGB сохраняются как 8-битные целые числа, поэтому мы делим значения в векторе на 255 (2 ^ 8-1), чтобы представить цвет как десятичное значение от 0,0 до 1,0. - person Dipack; 30.11.2018
comment
Этот ответ, хотя он оказался полезным для OP, неверен: model.fit(x, x, ...) - это именно то, что нужно делать, когда вы тренируете автокодировщик ... - person dedObed; 30.11.2018