Python 如何从数据帧在流中实现类索引的映射
我正在使用来自数据帧的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。我尝试了以下方法(未成功):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”
- 将带有标签的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,}
。
实际结果如下:
将数据帧列转换为4位时{'0000':0,'0001':1,'0007':2,'0008':3,'0011'…}
当我在创建生成器时提供或不提供“classes”参数[无论是作为dict还是list都无所谓]{'0':0,'1':1,'100':2,'1000':3,'1002':4,…}
非常感谢 一位善良聪明的同事来帮忙 当将标签列转换为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))))