【问题标题】:ValueError: Output of generator should be a tuple `(x, y, sample_weight)` or `(x, y)` while using Fit_generatorValueError:使用 Fit_generator 时,生成器的输出应该是元组 `(x, y, sample_weight)` 或 `(x, y)`
【发布时间】:2019-12-07 17:43:33
【问题描述】:

我一直在尝试使用一组训练和验证图像来教授模型,但我遇到了标题错误(我将在下面发布完整的)。 对如何进行有点迷失,之前关于这个主题的问题没有产生结果。 我的代码 sn-p 是:

train_datagen = ImageDataGenerator(
  preprocessing_function=preprocess_input,
  rotation_range=90,
  horizontal_flip=True,
  vertical_flip=True,
)

val_datagen = ImageDataGenerator(
      preprocessing_function=preprocess_input,
      rotation_range=90,
      horizontal_flip=True,
      vertical_flip=True,
    )

train_generator = train_datagen.flow_from_directory(VAL_DIR,
                                                    target_size=(HEIGHT, WIDTH),
                                                    batch_size=TRAIN_BATCH_SIZE,
                                                    class_mode=None,
                                                    shuffle=True)
val_generator = val_datagen.flow_from_directory(TRAIN_DIR,
                                                target_size=(HEIGHT, WIDTH),
                                                batch_size=VAL_BATCH_SIZE,
                                                class_mode=None,
                                                shuffle=True)

然后我尝试使用以下方法教模型:

history = finetune_model.fit_generator(train_generator,epochs=NUM_EPOCHS, workers=8,
                                   steps_per_epoch=num_train_images // TRAIN_BATCH_SIZE,
                                   validation_data=val_generator,
                                   validation_steps=num_val_images // VAL_BATCH_SIZE,
                                   shuffle=True, callbacks=callbacks_list)

我得到的错误是:

ValueError: Output of generator should be a tuple `(x, y, sample_weight)` or `(x, y)`. Found: [[[[-5.30867195e+01 -6.81702271e+01  2.66113968e+01]
   [-5.04675522e+01 -6.62993927e+01  2.90434952e+01]
   [-4.78483849e+01 -6.44285583e+01  3.14755783e+01]
   ...

我喜欢一些方向,因为我是一名初级 ML 学生。很乐意提供更多信息。 使用的图像为 jpeg 格式。 我能做些什么 ?似乎找不到问题。

【问题讨论】:

    标签: python-3.x machine-learning keras tf.keras


    【解决方案1】:

    修复错误:

    Per the documentation,指定class_mode=None 会生成一个只生成批次的图像数据,没有目标(用于model.predict_generator())。

    fit_generator needs a generator 产生一对(inputs, targets)。所以你不能让你的模型适合你现在使用的生成器,因为这些生成器没有说明模型应该适合什么目标。您需要弄清楚您的标签是什么,然后选择适当的class_mode,以便数据生成器包含这些标签。

    确保错误已修复:

    一旦您选择了正确的class_mode,您就可以通过打印/可视化批次来检查数据生成器的完整性1

    在这个例子中,我正在做多类(兔子、猫、狗)分类,所以默认的class_mode=categorical 可以正常工作。

    获得一批图像和标签后,该批中的第一个图像是狗,该批的第一个标签是[0, 0, 1](位于第2位的一个,从零开始计数),class_indices dict 表示狗图像具有标签 2 (从零开始计数)。

    1.一般来说,最好总是仔细检查这里的数据,即使数据生成器似乎正在工作;请参阅this post,在“在网前可视化”下。

    【讨论】:

    • 我删除了class_mode,代码开始运行。但是我检查了 keras ImageGenerator,它没有解释类模式的文档,只有示例。如果我的图像仅按文件夹名称标记,那么正确的参数是什么?谢谢!
    • 不同class_mode 值的文档(以及从文件夹名称推断类名)直接链接在我的答案first link 中。如果您的图像按文件夹名称标记,并且您正在进行多类分类,那么默认值 categorical 可能就是您想要的。我在我的答案中添加了一个关于如何检查生成器是否设置正确的部分,因此您可以使用它来确保一切正常。
    • 你是对的,我错过了通过手机观看的内容。我将尝试使用分类模式,看看我的模型是如何工作的。我感谢您回答奥林所花费的时间!
    猜你喜欢
    • 2019-09-22
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2017-03-14
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多