【问题标题】:python 3.x Keras ValueError: Error when checking target: expected seq_input to have shape (None, 2) but got array with shape (16, 1)python 3.x Keras ValueError:检查目标时出错:预期 seq_input 的形状为 (None, 2) 但得到的数组的形状为 (16, 1)
【发布时间】:2017-11-23 18:03:46
【问题描述】:

我对 Keras/Tensorflow 比较陌生,所以如果问题是基本的,我深表歉意。 我正在尝试在 VGG16 模型之上训练一个模型。

对于我正在使用的 VGG16:

input_tensor = Input(shape=(img_height, img_width, 3), name='Image_input')
vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)

然后是我要训练的模型:

seq_model = Sequential(name='seq_input')
seq_model.add(Flatten(input_shape=vgg16.output_shape[1:],  name='flatten'))
seq_model.add(Dense(256, activation='relu', name='dense1'))
seq_model.add(Dense(62, activation='relu', name='dense2'))
seq_model.add(Dropout(0.5))
seq_model.add(Dense(nb_classes, activation='sigmoid', name='Output'))

seq_model.compile(loss='binary_crossentropy',
                  optimizer='rmsprop',
                  metrics=['accuracy'])

将两者结合起来:

model = Model(input=vgg16.input, output=seq_model(vgg16.output))

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

数据增强:

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)


test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    classes=classes,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    classes=classes,
    class_mode='binary')

适合

model.fit_generator(train_generator,
                    steps_per_epoch=nb_train_samples//batch_size,
                    epochs=epochs,
                    validation_data=validation_generator,
                    validation_steps=nb_validation_samples // batch_size)

当我尝试训练模型时,代码似乎中断了;如果我单独运行它们,它似乎可以工作,但是当我将它们组合起来时,我会得到下面的错误(添加完整的回溯以防它有用)

Found 200 images belonging to 2 classes.
Found 80 images belonging to 2 classes.
Epoch 1/30
Traceback (most recent call last):
  File "C:/Users/nikfotei/Documents/Content/content/inHousemodel/trainModel.py", line 76, in <module>
    validation_steps=nb_validation_samples // batch_size)
  File "C:\ProgramData\Anaconda3\envs\py353\lib\site-packages\keras\legacy\interfaces.py", line 87, in wrapper
    return func(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\envs\py353\lib\site-packages\keras\engine\training.py", line 2077, in fit_generator
    class_weight=class_weight)
  File "C:\ProgramData\Anaconda3\envs\py353\lib\site-packages\keras\engine\training.py", line 1791, in train_on_batch
    check_batch_axis=True)
  File "C:\ProgramData\Anaconda3\envs\py353\lib\site-packages\keras\engine\training.py", line 1413, in _standardize_user_data
    exception_prefix='target')
  File "C:\ProgramData\Anaconda3\envs\py353\lib\site-packages\keras\engine\training.py", line 154, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking target: expected seq_input to have shape (None, 2) but got array with shape (16, 1)

Process finished with exit code 1

有什么想法吗? 如果有任何问题,请在 cmets 中告诉我

【问题讨论】:

  • 你能告诉我们你的标签在训练和测试中的形状是什么吗?
  • @DvirSamuel 我正在使用 flow_from_dir() 方法,它可以识别 2 个类,所以我猜 [[0, 1]] 抱歉不清楚!

标签: python-3.x tensorflow keras


【解决方案1】:

问题是您的标签形状与最后一层输出不匹配..
根据您发布的代码和它给您的错误,标签的形状是标量(!)(可能是 0 或 1),而模型的最后一层输出形状为 2 的数组(类似于 ([0.1, 0.9]、[0.5,0.5] 等)。
您应该将此参数添加到 flow_from_directory 函数:class_mode="categorical"
因此您的标签将被编码为单热格式(例如,0 将是 [1,0] 而 1 将是 [0,1] ..)

【讨论】:

  • 非常感谢!这很令人困惑,因为错误似乎在第一层,所以我认为问题出在两个模型的拼接上!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2019-03-28
  • 2017-10-22
  • 2018-10-24
  • 2019-01-10
  • 1970-01-01
相关资源
最近更新 更多