【问题标题】:Keras fit_generator producing exception: output of generator should be a tuple(x, y, sample_weight) or (x, y). Found: [[[[ 0.86666673Keras fit_generator 产生异常:生成器的输出应该是元组(x,y,sample_weight)或(x,y)。找到:[[[[ 0.86666673
【发布时间】:2017-03-14 06:02:33
【问题描述】:

我正在尝试为非 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]
   ...,**

因为这是一个自动编码器,所以在我的数据生成器中,使用了 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
                )

【问题讨论】:

  • 你能检查一下Keras的维度顺序是什么吗?如果你使用的是linux,配置文件在~/.keras/keras.json
  • 它是'th'。由于我使用的是 Windows PC,theano 是我唯一的选择

标签: python keras autoencoder


【解决方案1】:

真正的解决方案显然在于@skottapa 提出的 Keras 问题。

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

rodgzilla 提供了一个更新的 ImageDataGenerator,它添加了一个解决问题的 class_mode='input'。

好消息是您可以将修改反向移植到较旧的 Keras 版本。稍微修改的图像模块可以在这里下载:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2019-09-22
    • 1970-01-01
    • 2010-11-04
    • 2012-05-30
    相关资源
    最近更新 更多