MXNet ImageRecordIter测试数据/标签格式

时间:2017-08-04 03:36:09

标签: machine-learning deep-learning data-science mxnet

我在理解MXNet ImageRecordIter的工作原理时遇到了一些麻烦。 Here是我一直在使用的参考

首先, - test-ratio标志实际上做了什么?生成lst文件时,我无法确定哪些行是测试数据。

我遇到的另一个更大的问题是标签的格式。如果我们有N个类,标准神经网络输出可能是具有N维的softmax'd向量。在这种情况下,正常标签将是1热门编码,其尺寸为1,映射到我们的类。但ImageRecordIter似乎它的标签格式只是一个数字?现场魔术背后是否有一些?

1 个答案:

答案 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:如果读者有时间,我会鼓励使用固定命令将拉取请求提交到存储库,文章。