ValueError: 使用Fit_generator时,生成器的输出应为元组`(x, y, sample_weight)`或`(x, y)`

我一直在尝试使用一组训练和验证图像来训练模型,并且我遇到了标题中的错误(我将在下面发布完整的错误信息)。我不知道该如何继续,之前关于这个话题的问题也没有得到结果。我的代码片段是:

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]   ...

我很希望得到一些指导,因为我是一个刚开始学习机器学习的学生。很乐意提供更多信息。我使用的图像格式是jpeg。我该怎么办?我似乎找不到问题所在。


回答:

修复错误:

根据文档,指定class_mode=None会生成一个仅输出图像数据批次的生成器,没有目标(旨在与model.predict_generator()一起使用)。

fit_generator 需要一个生成器,该生成器输出(inputs, targets)对。因此,您不能将模型拟合到当前使用的生成器上,因为这些生成器没有说明模型应该拟合的目标是什么。您需要弄清楚您的标签是什么,然后选择合适的class_mode,以便数据生成器包含这些标签。

确保错误已修复:

一旦您选择了正确的class_mode,您可以通过打印/可视化一个批次来对数据生成器进行健全性检查1

展示可视化批次

在这个例子中,我在进行多类别(兔子、猫、狗)分类,所以默认的class_mode=categorical可以很好地工作。

在获取批次的图像和标签后,该批次中的第一张图像是狗,该批次的第一个标签是[0, 0, 1](在第2个位置有一个1,从零开始计数),class_indices字典表示狗的图像标签为2(从零开始计数)。

1. 一般来说,即使数据生成器似乎在工作,也总要仔细检查这里的数据,这是一个好主意;请参见这篇文章,在“visualize just before the net”部分。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注