【问题标题】:Tensorflow Keras different number of categories in training and validationTensorflow Keras 在训练和验证中的类别数量不同
【发布时间】:2020-08-12 14:27:47
【问题描述】:

我正在使用 Keras 的内置 Resnet(添加到顺序)和数据生成器构建图像分类器。图像存储在单独的文件夹中,文件夹充当类。

问题在于训练数据集中有 464 个类,而验证数据集中有 683 个类。因此,当我运行时:

model.fit_generator(
    train_datagen, 
    steps_per_epoch = STEP_SIZE_TRAIN,
    epochs = EPOCHS,
    verbose = 1,
    callbacks = [cp_callback, cp_tensorboard],
    validation_data = val_datagen,
    validation_freq = 2
)

我得到了错误

ValueError: Error when checking target: expected dense_2 to have shape (464,) but got array with shape (683,)

这是有道理的;在训练集上训练的模型无法评估它没有节点的类。不过,是否可以修改我的模型或数据集部门来解决此问题?

或者,有没有办法将validation_split 与数据生成器一起使用,让我无需接触单独的数据集即可进行验证?

【问题讨论】:

  • 您应该拥有训练数据集中所有类的数据,否则没有意义,您将无法预测那些不在训练数据中的类。
  • 使用 numpy 过滤您的验证数据,并仅使用与训练数据具有相同标签的样本。您的模型只能预测它在训练中看到的类样本。
  • @AugustoMaillo 我如何过滤来自生成器的输出?我是否需要创建自己的自定义生成器而不是使用内置的 ImageDataGenerator 类来读取验证数据?
  • 您可以在定义 ImageDataGenerator 之前创建自己的自定义生成器或过滤数据。使用 numpy 过滤数据。检查 np.where、np.any 等。

标签: tensorflow keras tensorflow-datasets


【解决方案1】:

您需要为仅包含经过训练的类的验证集维护一个 DataFrame。稍后您可以使用 Keras ImageDataGeneratorflow_from_dataframe 函数来解决您的问题。 您可以按照以下代码进行操作。

images = []
classes = []
#To filter classes from validation set 
for i in train_classes:
  image_list = os.listdir("Validation/" + i + "/") 
  cl = [i] * len (image_list)
  images.extend(image_list)
  classes.extend(cl)

val_df = pd.DataFrame({"Images":images, "Classes":classes})

val_datgen = ImageDataGenerator(rescale=1./255)

validation_generator = val_datagen.flow_from_dataframe(
        dataframe=val_df,
        directory='Validation',
        x_col="Images",
        y_col="Classes",
        target_size=(150, 150),
        batch_size=32,
        class_mode='categorical')

其中 train_classes 是训练数据中的类列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2020-03-25
    • 2018-10-26
    相关资源
    最近更新 更多