【问题标题】:Keras ImageDataGenerator not working as expectedKeras ImageDataGenerator 未按预期工作
【发布时间】:2016-12-26 02:53:55
【问题描述】:

我正在尝试使用 Keras 构建一个自动编码器,基于文档中的 [this example][1]。因为我的数据很大,所以我想使用生成器来避免将其加载到内存中。

我的模型看起来像:

model = Sequential()
model.add(Convolution2D(16, 3, 3, activation='relu', border_mode='same', input_shape=(3, 256, 256)))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(16, 3, 3, activation='relu'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same'))

model.compile(optimizer='adadelta', loss='binary_crossentropy')

我的发电机:

from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode='binary', batch_size=32, target_size=(256, 256))

然后拟合模型:

model.fit_generator(
        train_generator,
        samples_per_epoch=1,
        nb_epoch=1,
        verbose=1,
        )

我收到此错误:

异常:检查模型目标时出错:预期的 convolution2d_76 有 4 个维度,但得到的数组的形状为 (32, 1)

这看起来像是我的批次而不是样本的大小。我做错了什么?

【问题讨论】:

    标签: deep-learning keras autoencoder


    【解决方案1】:

    错误很可能是由class_mode='binary' 引起的。它使生成器生成二进制类,因此输出形状为(batch_size, 1),而您的模型生成四维输出(因为最后一层是卷积)。

    我猜你希望你的标签是图像本身。根据flow_from_directory的来源和它使用的DirectoryIterator,仅仅改变class_mode是不可能的。一个可能的解决方案是:

    train_generator_ = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode=None, batch_size=32, target_size=(256, 256))
    def train_generator():
        for x in train_iterator_:
            yield x, x
    

    请注意,我将class_mode 设置为None。它使生成器只返回image 而不是tuple(image, label)。然后我定义了一个新的生成器,它将图像作为输入和标签返回。

    【讨论】:

    • 太棒了,非常感谢!现在一切正常。我很困惑,因为我认为它在谈论输入形状,但在实施您的解决方案后,我发现问题出在输出形状。
    猜你喜欢
    • 2017-09-22
    • 2018-08-07
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    相关资源
    最近更新 更多