【发布时间】: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