我在使用MNIST数据集,其中X_train = (42000,28,28,1)
是训练集,y_train = (42000,10)
是对应的标签集。现在我使用Keras创建了一个图像生成器的迭代器,如下所示:
iter=datagen.flow(X_train,y_train,batch_size=32)
这个操作运行正常。
然后我使用以下代码训练模型:
model.fit_generator(iter,steps_per_epoch=len(X_train)/32,epochs=1)
在这里,它会报出以下错误:
ValueError: Error when checking input: expected dense_9_input to have 2 dimensions, but got array with shape (32, 28, 28, 1)
我尝试过但未能找到错误所在。我也在这里搜索过,但没有找到答案:
expected dense_218_input to have 2 dimensions, but got array with shape (512, 28, 28, 1)
请帮助我。
更新:
model=Sequential()model.add(Dense(256,activation='relu',kernel_initializer='he_normal',input_shape=(28,28,1)))model.add(Flatten())model.add(Dense(10,activation='softmax',kernel_initializer='he_normal'))
回答:
维度不匹配是根本原因。输入形状与ImageDataGenetor
期望的不匹配。请查看以下使用mnist
数据的示例。我使用的是Tensorflow 2.1
。
import tensorflow as tffrom tensorflow.keras.preprocessing.image import ImageDataGeneratormnist = tf.keras.datasets.mnist(x_train, y_train),(x_test, y_test) = mnist.load_data()x_train, x_test = x_train / 255.0, x_test / 255.0x_train = tf.expand_dims(x_train,axis=-1)x_test = tf.expand_dims(x_test,axis=-1)datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2)iter=datagen.flow(x_train,y_train,batch_size=32)model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28,1)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax')])model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])#model.fit_generator(iter,steps_per_epoch=len(X_train)/32,epochs=1) # 在TF2.1中已废弃model.fit_generator(iter,steps_per_epoch=len(iter),epochs=1)model.evaluate(x_test, y_test)
完整代码在这里