Python 如何从数据帧在流中实现类索引的映射

Python 如何从数据帧在流中实现类索引的映射,python,dataframe,keras,generator,Python,Dataframe,Keras,Generator,我正在使用来自数据帧的flow_设置keras数据生成器。 数据是图像,有2000个不同的类。我有一个数据框,它将图像文件映射到2000个类别(从0到1999的整数)。两列(指向图像和标签的链接)的格式均为字符串 我有一个由其他人训练的网络,它具有从class_索引到标签的定义映射。问题是:当我使用我想要测试训练模型的数据设置数据生成器时,它在标签上强制执行字母数字顺序,这与训练网络使用的标签不同。现在我得到“0”是0,“1”是1,但“100”是2,“1000”是3等等,但我想“2”是2,“3”

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

我有一个由其他人训练的网络,它具有从class_索引到标签的定义映射。问题是:当我使用我想要测试训练模型的数据设置数据生成器时,它在标签上强制执行字母数字顺序,这与训练网络使用的标签不同。现在我得到“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”参数,并以所需的顺序提供一个列表——但是,该顺序会被覆盖

  • 为数据生成器的构造提供“classes”参数,并提供所需映射的字典——但是,这同样会被覆盖并导致初始问题 (它似乎适用于“来自\u目录的flow\u”:,但不适用于我使用来自\u数据框架的flow\u)

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

    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 = list(map(str,range(2000)))

预期的结果是,在
my_generator.class_index
中,我得到
{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,…}
    当我在创建生成器时提供或不提供“classes”参数[无论是作为dict还是list都无所谓]
很可能是我在监督实际问题(也许这是很有可能的,但我只是错过了一个细节,我甚至可能没有在这里报告——如果是这样的话,请原谅,不要犹豫,想想比我想象的更简单的解决我的问题的方法)。
非常感谢

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

当将标签列转换为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_可以选择关闭字母数字排序,那么这仍然很酷

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