让我们首先从--train-ratio 和--test-ratio 开始。这两个键仅用于将所有图像拆分到测试组和训练组。 Here is 在处理这些标志的代码中的精确位置。让我从那里复制粘贴逻辑:
if args.train_ratio == 1.0:
write_list(args.prefix + str_chunk + '.lst', chunk)
else:
if args.test_ratio:
write_list(args.prefix + str_chunk + '_test.lst', chunk[:sep_test])
if args.train_ratio + args.test_ratio < 1.0:
write_list(args.prefix + str_chunk + '_val.lst', chunk[sep_test + sep:])
write_list(args.prefix + str_chunk + '_train.lst', chunk[sep_test:sep_test + sep])
可以看出,如果 --train-ratio 设置为 1.0,它会完全忽略任何测试比率,只是转储文件中的所有图像(在我们的例子中为 caltech.lst)。这是造成混淆的主要原因,因为这是填充 --train-ratio 的默认值的方式:
cgroup.add_argument('--train-ratio', type=float, default=1.0,
help='Ratio of images to use for training.')
默认设置为1.0。因此,如果未设置 --train-ratio,则设置为 --test-ratio 的内容无关紧要。牢记这一点,让我们看看来自article 的命令:
os.system('python %s/tools/im2rec.py --list=1 --recursive=1 --shuffle=1 --test-ratio=0.2 data/caltech data/101_ObjectCategories'%os.environ['MXNET_HOME'])
这里的命令只包含--test-ratio,因此它不会像文章声称的那样生成2个文件(./data/caltech_train.lst和./data/caltech_test.lst),而是生成一个文件(./data/caltech.lst),原因如上所述。
为了解决这个问题,需要执行正确的命令:
os.system('python %s/tools/im2rec.py --list=1 --recursive=1 --shuffle=1 --test-ratio=0.2 --train-ratio=0.8 data/caltech data/101_ObjectCategories'%os.environ['MXNET_HOME'])
在这一点上,我希望清楚造成混乱的原因以及所需键的工作方式。
现在,根据问题的第二部分。 im2rec.py 是准备数据的辅助脚本。它与您实际计划如何使用数据的方式无关。因此它将标签存储为数字(顺便说一句,每个图像可能有超过 1 个标签)。并且由此类列表的消费者将标签编号转换为他/她想要用于培训的任何内容。您可以将它与 SoftMax 一起使用,方法是创建一个大小等于标签数量的向量并将 1 设置为索引等于标签编号的单元格。
PS:如果读者有时间,我会鼓励读者将带有固定命令的 pull-request 连同文章一起提交到存储库。