我在理解MXNet ImageRecordIter的工作原理时遇到了一些麻烦。 Here是我一直在使用的参考
首先, - test-ratio标志实际上做了什么?生成lst文件时,我无法确定哪些行是测试数据。
我遇到的另一个更大的问题是标签的格式。如果我们有N个类,标准神经网络输出可能是具有N维的softmax'd向量。在这种情况下,正常标签将是1热门编码,其尺寸为1,映射到我们的类。但ImageRecordIter似乎它的标签格式只是一个数字?现场魔术背后是否有一些?
答案 0 :(得分:1)
让我们先从--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
。因此,如果未设置--test-ratio
,则设置为--train-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
是准备数据的辅助脚本。它与您实际计划使用数据的方式无关。因此,它将标签存储为数字(BTW,每个图像可能有多于1个标签)。并且由此类列表的消费者将标签号转换为他/她想要用于训练的任何东西。您可以将它与SoftMax一起使用,方法是创建一个大小等于标签数量的向量,并将1设置为索引等于标签号的单元格。
PS:如果读者有时间,我会鼓励使用固定命令将拉取请求提交到存储库,文章。