Keras fit_generator producing exception: output of generator should be a tuple(x, y, sample_weight) or (x, y). Found: [[[[ 0.86666673

南笙酒味 提交于 2019-12-22 18:04:03

问题


I am trying to build an autoencoder for non MNIST, non Imagenet data. Using https://blog.keras.io/building-autoencoders-in-keras.html as my base. However, am getting the following error.

**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]
   ...,**

Since this is an autoencoder, in my datagenerator, used class mode=None. My code is as follows.

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
                )

回答1:


The real solution lies in this Keras issue apparently by @skottapa.

https://github.com/fchollet/keras/issues/4260

rodgzilla provided an updated ImageDataGenerator that adds a class_mode='input' that solves the problem.

The nice thing is that you can backport the modification to older Keras versions. A slightly modified image module can be downloaded here:

https://gist.github.com/gsdefender/293db0987a800cf1b103b7777966f8af



来源:https://stackoverflow.com/questions/40354303/keras-fit-generator-producing-exception-output-of-generator-should-be-a-tuplex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!