【问题标题】:Keras dimension mismatch with ImageDataGeneratorKeras 尺寸与 ImageDataGenerator 不匹配
【发布时间】:2017-01-30 22:56:43
【问题描述】:

我正在尝试使用 Keras 将我的数据“流入”到神经网络中。我正在使用 .flow_from_directory 方法,这个过程很适合我。我正在使用 keras 文档中的基本示例(我正在使用 tensorflow):

ROWS = 64
COLS = 64
CHANNELS = 3

from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
    rescale=1./255)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    'train',
    target_size=(64, 64),
    batch_size=32,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    '../tutorial/l1/kaggle_solutions/dogs_vs_cats/valid',
    target_size=(64, 64),
    batch_size=1,
    class_mode='binary')
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import Dense, Activation, Flatten, Dropout, MaxPooling2D
from keras.regularizers import l2

model = Sequential()
model.add(Convolution2D(4, 4, 4, border_mode='same', input_shape=(64, 64,3), activation='relu'))
from keras.utils.np_utils import to_categorical
from keras.optimizers import SGD, RMSprop

model.compile(loss='binary_crossentropy', optimizer=RMSprop(lr=1e-4), metrics=['accuracy'])


model.fit_generator(
    train_generator,  
    samples_per_epoch=2500,
    nb_epoch=20,
    validation_data=validation_generator,
    nb_val_samples=3100)

运行这个我得到以下错误:

Exception: Error when checking model target: expected convolution2d_84 to have 4 dimensions, but got array with shape (32, 1)

我折腾了很长时间,发现了以下内容——将“model.add”切换为灰度输入 model.add(Convolution2D(4, 4, 4, border_mode='same', input_shape=(64, 64,3), activation='relu')) 给了我以下错误(正如预期的那样——但似乎确认我的原始输入是正确的):

Error when checking model input: expected convolution2d_input_49 to have shape (None, 64, 64, 1) but got array with shape (32, 64, 64, 3)

所以我正在(在原始中)传递一个 32、64、64、3 的 4 维数组和原始数组,但我得到了我认为的错误 预期 (1,64,64,3) 并得到 (32,64,64,3)

当我以 32 个批次发送数据时。奇怪的是,如果我将批次设置为零(以提供 0、64、64、3 输入),我得到:

Exception: Error when checking model target: expected convolution2d_87 to have 4 dimensions, but got array with shape (0, 1)

根据文档,我无法找出将数据流入模型的正确方法——我在使用 fit_generator 时无法将批量大小传递给模型,而且看起来 batch_size(样本数)是问题。

任何帮助将不胜感激。

【问题讨论】:

    标签: tensorflow keras conv-neural-network


    【解决方案1】:

    您的ImageDataGenerator 没有问题。如错误消息中所述,模型输出的形状与其目标的形状不匹配。您使用class_mode = 'binary',因此模型的预期输出是单个值,但它会产生形状为(batch_size, 64, 64, 4) 的输出,因为您的模型中只有一个卷积层而没有其他任何东西。

    试试这样的:

    model.add(Convolution2D(4, 4, 4, border_mode='same', input_shape=(64, 64,3), activation='relu'))
    model.add(Flatten())
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    

    【讨论】:

    • 这可能是一个好点,我已经撕掉了我的网的顶层并且正在检查它(正如我所说,我非常沮丧)。最后,我不得不将我的生成器从“二进制”切换到“分类”并重新启动我的内核(旧的打开它并使用技巧)。即使现在二进制也不起作用 - 但正如您正确建议的那样,它与输入形状有关。我会“接受”这个答案,因为它是“输入”,尽管标签是问题所在。我非常感谢您对此进行调查。关于 fit_generator 的例子并不多。在 kaggle 有一群人在等我的例子
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2017-02-26
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多