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)))
——旧答案——
您可能已经将训练数据和验证数据放在train
和validation
下的子文件夹中,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))