Model.fit_generator()形状错误


import os
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
img_width, img_height = 64, 64
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = sum([len(files) for files in os.walk(train_data_dir)])
nb_validation_samples = sum([len(files) for files in os.walk(validation_data_dir)])
nb_epoch = 10

model = Sequential()
model.add(Dense(4096, input_dim = 4096, init='normal', activation='relu'))
model.add(Dense(4,init='normal',activation='softmax'))
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(
        rescale=1./255,
        )

test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        color_mode="grayscale",
        target_size=(img_width, img_height),
        batch_size=1,
        class_mode=None)
validation_generator = test_datagen.flow_from_directory(
        validation_data_dir,
        color_mode="grayscale",
        target_size=(img_width, img_height),
        batch_size=1,
        class_mode=None)
model.fit_generator(
        train_generator,
        samples_per_epoch=nb_train_samples,
        nb_epoch=nb_epoch,
        validation_data=validation_generator,
        nb_val_samples=nb_validation_samples)

在上面代码中的model.fit_generator()出现之前,一切都运行良好。然后弹出如下错误。

Traceback (most recent call last):
  File "C:/Users/Sam/PycharmProjects/MLP/Testing Code without CNN.py", line 55, in <module>
    nb_val_samples=nb_validation_samples)
  File "C:Python27libsite-packageskerasmodels.py", line 874, in fit_generator
    pickle_safe=pickle_safe)
  File "C:Python27libsite-packageskerasenginetraining.py", line 1427, in fit_generator
    'or (x, y). Found: ' + str(generator_output))
Exception: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: [[[[ 0.19215688]

问题应该是由于数据维度不匹配引起的。ImageDataGenerator实际加载图像文件,并以(num_image_channel, image_height, image_width)的形式放入numpy数组中。但是你的第一层是一个密集连接的层,它正在寻找一维阵列形状的输入数据,或者具有多个样本的二维阵列。所以基本上你失去了你的输入层,它以正确的形状接收输入。

更改以下代码行

model.add(Dense(4096, input_dim = 4096, init='normal', activation='relu'))

model.add(Reshape((img_width*img_height*img_channel), input_shape=(img_channel, img_height, img_width)))
model.add(Dense(4096, init='normal', activation='relu'))

您必须定义img_channel,这是图像中的通道数。上面的代码还假设您正在使用th中的dim_ordering。如果您使用tf输入维度排序,则必须将输入重塑图层更改为

model.add(Reshape((img_width*img_height*img_channel), input_shape=(img_height, img_width, img_channel)))

——旧答案——

您可能已经将训练数据和验证数据放在trainvalidation下的子文件夹中,Keras不支持。所有的训练数据应该放在一个文件夹中,验证数据也是如此。

请参考本Keras教程了解更多细节

我不是100%确定你想要实现什么,但如果你正在尝试对图片进行二进制分类,尝试将class_mode设置为binary。来自文档:

class_mode: "categorical", "binary", "sparse"或None之一。默认值:"直言"。确定返回的标签数组的类型:"分类"将是2D单热编码标签,"二进制"将是1D二进制标签,"sparse"将是1D整数标签。

这个错误信息有点令人困惑,但是如果你看一下源代码,它就变得更清晰了:

if not hasattr(generator_output, '__len__'):
                    _stop.set()
                    raise Exception('output of generator should be a tuple '
                                    '(x, y, sample_weight) '
                                    'or (x, y). Found: ' + str(generator_output))

相关内容

  • 没有找到相关文章

最新更新