【问题标题】:Keras ImageDataGenerator() expect 3D data and 4-rank tensor at once?Keras ImageDataGenerator() 期望 3D 数据和 4 秩张量一次?
【发布时间】:2018-02-22 19:56:24
【问题描述】:

我一直在尝试在 MNIST 上使用 keras.preprocessing.image.ImageDataGenerator() 来获取更多示例。

我在 Keras 之上使用全连接网络。在构建和编译模型之前,我首先将 3D MNIST 重塑为 4D 张量,然后使用数据增强来帮助拟合模型。

X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)


model = Sequential(name="mlp")

model.add(ll.InputLayer([28, 28]))
model.add(ll.Flatten())

model.add(ll.Dense(512, kernel_regularizer=regularizers.l2(0.04)))
model.add(ll.Activation('relu'))

model.add(ll.Dense(512, kernel_regularizer=regularizers.l2(0.04)))
model.add(ll.Activation('relu'))


model.add(ll.Dense(256, kernel_regularizer=regularizers.l2(0.04)))
model.add(ll.Activation('relu'))

model.add(ll.Dense(128, kernel_regularizer=regularizers.l2(0.04)))
model.add(ll.Activation('relu'))

model.add(ll.Dense(32, kernel_regularizer=regularizers.l2(0.04)))
model.add(ll.Activation('relu'))

model.add(ll.Dense(10, activation='softmax'))

model.compile("adam", "categorical_crossentropy", metrics=["accuracy"])


gen = ImageDataGenerator(rotation_range=8, width_shift_range=0.08, shear_range=0.3,
                         height_shift_range=0.08, zoom_range=0.08)

test_gen = ImageDataGenerator()
train_generator = gen.flow(X_train, y_train, batch_size=64)
test_generator = test_gen.flow(X_test, y_test, batch_size=64)

...
model.fit_generator(train_generator, steps_per_epoch=60000//64, epochs=5, 
                    validation_data=test_generator, validation_steps=10000//64)

我收到此错误:

  5 model.fit_generator(train_generator, steps_per_epoch=60000//64, epochs=5, 
    ----> 6                     validation_data=test_generator, validation_steps=10000//64)

ValueError: Error when checking input: expected input_6 to have 3 dimensions, but got array with shape (256, 28, 28, 1)

但是当我省略它转换为 4d 张量时,会发生这种情况:

     52 test_gen = ImageDataGenerator()
    ---> 53 train_generator = gen.flow(X_train, y_train, batch_size=64)
         54 test_generator = test_gen.flow(X_test, y_test, batch_size=64)

ValueError: ('Input data in `NumpyArrayIterator` should have rank 4. You passed an array with shape', (50000, 28, 28))

似乎训练和测试生成器对象生成 4D 张量,但模型本身需要 3D 张量。

【问题讨论】:

  • 请写型号代码
  • 您的第一个错误表明您的模型是问题,而不是 ImageDataGenerator。更多细节将有助于回答您的问题。要排除的另一件小事:如果您在生成器中指定batch_size=64,请将其放入model.fit_generator 调用中。否则默认为32。这在过去给我带来了问题。
  • 谢谢@DexterMorgan。我已经更新了帖子。我尝试在fit_generator 方法中使用batch_size=64,但我收到了一个意外的关键字参数错误。无论如何,为了安全起见,我将尺寸更改为全部反映 32 个批次。这不会改变错误。编辑:我还应该补充一点,该模型可以通过使用 .fit 方法在没有数据增强的情况下正常工作,因此问题可能是模型与 ImageDataGenerator 的兼容性,而不是模型本身。

标签: tensorflow keras


【解决方案1】:

嗯,你的数据是(batch, 28, 28, 1),而你的模型(输入层)期待(batch, 28, 28)

解决这个问题就像改变模型的输入形状一样简单:

#you don't need to add an input layer, actually, just pass the shape to the first layer:

 model = Sequential(name="mlp")
 model.add(ll.Flatten(input_shape=(28,28,1)))

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2018-01-19
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多