【问题标题】:How to enforce mapping of class_indices in flow_from_dataframe如何在 flow_from_dataframe 中强制执行 class_indices 的映射
【发布时间】:2020-01-25 20:16:29
【问题描述】:

我正在使用 flow_from_dataframe 设置一个 keras 数据生成器。 数据是图像,有 2000 个不同的类别。我有一个数据框,它将图像文件映射到 2000 个类别(从 0 到 1999 的整数)。两列(图像和标签的链接)都被格式化为字符串。

我有一个由其他人训练的网络,具有从 class_indices 到标签的定义映射。这就是问题所在:当我使用要测试训练模型的数据设置数据生成器时,它会在标签上强制执行与训练网络使用的不同的字母数字顺序。我现在知道“0”是 0,“1”是 1,但“100”是 2,“1000”是 3 等等,但我希望“2”是 2,“3”是 3 等等。

因此,经过训练的模型以 0% 的准确率执行。

如何规避数据生成器中的字母数字顺序(例如“2”为 2,“3”为 3)?

我正在使用 keras 2.2.4。我尝试了以下方法(不成功):

  • 将 pandas 数据框中带有标签的列转换为 %04d 格式,这样,如果按字母数字排序,它应该会产生所需的顺序 - 但是,这会产生不同的顺序('0000': 0, '0001': 1, '0007': 2, '0008': 3, '0011' ...)

  • 为数据生成器的构造提供“classes”参数,并按所需顺序列出 - 但是,此顺序会被覆盖

  • 为数据生成器的构造提供“类”参数以及所需映射的字典 - 然而,这再次被覆盖并导致最初的问题 (它似乎适用于“flow_from_directory”:Is it possible to change class indices of Keras flow from directory,但它不适用于 flow_from_dataframe)

我正在尝试的基本上是这样的:

    my_generator = my_datagen.flow_from_dataframe(
        dataframe=my_df,
        target_size = (224,224),
        directory=None,
        x_col='filename',
        y_col='yID',
        class_mode='categorical',
        classes=classLabels,
        validate_filenames=False,
        batch_size=128)

classLabels 可以在哪里

classLabels = list(map(str,range(2000)))

classLabels = list(map(str,range(2000)))
classLabels = dict(zip(classLabels,list(range(2000))))

预期结果是在my_generator.class_indices 中,我得到{'0': 0, '1': 1, '2': 2, '3': 3, ...}。 实际结果例如

  • {'0000': 0, '0001': 1, '0007': 2, '0008': 3, '0011' ...} 将数据框列转换为 4 位时
  • {'0': 0, '1': 1, '100': 2, '1000': 3, '1002': 4, ...} 当我在创建生成器时提供或不提供“类”参数[无论是作为字典还是列表都无关紧要]

很可能是我正在监督实际问题(也许这很有可能,但我只是遗漏了一个我什至可能不会在这里报告的细节——如果是这种情况,请原谅,并做毫不犹豫地想出比我想象的更简单的解决方案)。 非常感谢!

【问题讨论】:

    标签: python dataframe keras generator


    【解决方案1】:

    一位善良而聪明的同事前来帮忙。

    在将标签列转换为 4 位字符串时它给出了奇怪的顺序是因为特定的(测试)数据框没有所有 2000 个类,而只是一个子集。

    所以原则上,4 位转换是正确的方法(如果有人需要这个:my_df['yID'] = my_df['yID'].astype(str).str.zfill(4))。

    当时唯一缺少的是另外指定一个classLabels 字典,其中的字符串也是 4 位格式:

    classLabels = list(map(lambda x: "{:04d}".format(x),range(2000)))
    classLabels = dict(zip(classLabels,list(range(2000))))
    

    所以基本上只是结合我正在尝试的东西。

    如果这可以直接在 keras 中实现,即如果 flow_from_dataframe 可以选择关闭字母数字排序,那仍然会很酷。

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多