Ошибка значения с размерами при проектировании простого автоэнкодера - PullRequest
0 голосов
/ 13 октября 2018

Привет, я пробую простой авто-кодер в Python 3.5 с использованием библиотеки Keras.Проблема, с которой я сталкиваюсь, - ValueError: Ошибка при проверке ввода: ожидалось, что input_40 будет иметь 2 измерения, но получил массив с формой (32, 256, 256, 3).Мой набор данных очень маленький (60 изображений RGB с размером - 256 * 256 и один тип изображения для проверки).Я немного новичок в Python.Пожалуйста, помогите.

import matplotlib.pyplot as plt
from keras.layers import Input, Dense
from keras.models import Model

#Declaring the model
encoding_dim = 32
input_img = Input(shape=(65536,))
encoded = Dense(encoding_dim, activation='relu')(input_img)
decoded = Dense(65536, activation='sigmoid')(encoded)
autoencoder = Model(input_img, decoded)
encoder = Model(input_img, encoded)
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')


#Constructing a data generator iterator
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set=
train_datagen.flow_from_directory('C:\\Users\\vlsi\\Desktop\\train',
batch_size = 32,
class_mode = 'binary')
test_set =     
test_datagen.flow_from_directory('C:\\Users\\vlsi\\Desktop\\validation',
batch_size = 32,
class_mode = 'binary')


#fitting data
autoencoder.fit_generator(training_set,
steps_per_epoch = 80,
epochs = 25,
validation_data = test_set,
validation_steps = 20)

import numpy as np from keras.preprocessing import image
test_image =            
image.load_img('C:\\Users\\vlsi\\Desktop\\validation\\validate\\apple1.jpg')
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)

#Displaying output
encoded_imgs = encoder.predict(test_image)
decoded_imgs = decoder.predict(encoded_imgs)
plt.imshow(decoded_imgs)

1 Ответ

0 голосов
/ 13 октября 2018

Проблема здесь:

input_img = Input(shape=(65536,))

Вы сказали Keras, что у входа в сеть будет 65K измерений, что означает вектор формы (сэмплы, 65536), но ваши фактические входы имеют форму (сэмплы,256, 256, 3).Любым простым решением было бы использовать реальную входную форму и для сети выполнить необходимое изменение формы:

input_img = Input(shape=((256, 256, 3))
flattened = Flatten()(input_img)
encoded = Dense(encoding_dim, activation='relu')(flattened)
decoded = Dense(256 * 256 * 3, activation='sigmoid')(encoded)
decoded = Reshape((256, 256, 3))(decoded)
autoencoder = Model(input_img, decoded)
encoder = Model(input_img, encoded)
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))

Обратите внимание, что сначала я добавил слой Flatten и Reshape, чтобы сгладить изображение, а затем выполнитьсплющенное изображение обратно в форму (256, 256, 3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...