我正在尝试为非MNIST,非Imagenet数据构建自动编码器。使用https://blog.keras.io/building-autoencoders-in-keras.html作为我的基础。但是,我收到以下错误。
**Exception: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: [[[[ 0.86666673 0.86666673 0.86666673 ..., 0.62352943 0.627451
0.63137257]
[ 0.86666673 0.86666673 0.86666673 ..., 0.63137257 0.627451
0.627451 ]
[ 0.86666673 0.86666673 0.86666673 ..., 0.63137257 0.627451
0.62352943]
...,**
由于这是一个自动编码器,在我的datagenerator中,使用了class mode = None。我的代码如下。
from keras.layers import Input, Dense, Convolution2D, MaxPooling2D, UpSampling2D,Activation, Dropout, Flatten
from keras.models import Model,Sequential
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import os
import h5py
img_width=140
img_height=140
train_data_dir=r'SitePhotos\train'
valid_data_dir=r'SitePhotos\validation'
input_img = Input(batch_shape=(32,3, img_width, img_width))
x = Convolution2D(16, 3, 3, activation='relu', border_mode='same')(input_img)
x = MaxPooling2D((2, 2), border_mode='same')(x)
x = Convolution2D(8, 3, 3, activation='relu', border_mode='same')(x)
x = MaxPooling2D((2, 2), border_mode='same')(x)
x = Convolution2D(8, 3, 3, activation='relu', border_mode='same')(x)
encoded = MaxPooling2D((2, 2), border_mode='same')(x)
# at this point the representation is (8, 4, 4) i.e. 128-dimensional
x = Convolution2D(8, 3, 3, activation='relu', border_mode='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Convolution2D(8, 3, 3, activation='relu', border_mode='same')(x)
x = UpSampling2D((2, 2))(x)
x = Convolution2D(16, 3, 3, activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='mse')
valid_datagen = ImageDataGenerator(rescale=1./255)
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=32,
class_mode=None,
shuffle=True)
valid_generator = valid_datagen.flow_from_directory(
valid_data_dir,
target_size=(img_width, img_height),
batch_size=32,
class_mode=None,
shuffle=True)
autoencoder.fit_generator(train_generator,
nb_epoch=50,
validation_data=valid_generator,
samples_per_epoch=113,
nb_val_samples=32
)
答案 0 :(得分:1)
真正的解决方案在于这个Keras问题,显然是由@skottapa。
https://github.com/fchollet/keras/issues/4260
rodgzilla提供了一个更新的ImageDataGenerator,它添加了一个解决问题的class_mode ='input'。
好消息是您可以将修改后移到较旧的Keras版本。稍微修改过的图像模块可以在这里下载:
https://gist.github.com/gsdefender/293db0987a800cf1b103b7777966f8af