首页 > 解决方案 > 如何在 MXNet C++ 实现中使用 .rec 格式进行训练?

问题描述

MXNet 的 C++ 示例包含 MNISTIter、MNIST 数据集(.idx3-ubyte.idx1-ubyte)的模型训练示例。然而,相同的代码实际上建议使用 im2rec 工具来生成数据,它会生成不同的 .rec 格式。看起来.rec格式在同一个文件中包含图像和标签,因为 im2rec 需要一个准备好的.lst文件,其中包含两者(每行的数字、标签和图像文件名)。

我已经生成了类似的代码

auto val_iter = MXDataIter("ImageRecordIter");
setDataIter(&val_iter, "Train", vector < string > 
  {"output_train.rec", "output_validate.rec"}, batch_size));

所有文件都存在但它失败了,因为向量中仍然需要四个文件(分段错误)。但是为什么,标签现在不应该在文件中?

深入研究代码,我发现 setDataIter 实际上设置了参数。ImageRecordIter 的参数可以在这里找到。我尝试设置诸如 path_imgrec、path.imgrec 之类的参数,然后调用 .CreateDataIter() 但这一切都没有帮助 - 第一次尝试使用迭代器时出现分段错误。

我无法在整个互联网上找到一个关于如何使用 .rec 文件格式在 C++ 中训练任何 MxNet 神经网络以进行训练和验证集的示例。可能吗?我发现的唯一解决方法是尝试生成 MNIST 输出示例所涵盖的文件的原始 MNIST 工具。

标签: c++mxnet

解决方案


最终,我使用Mnisten生成匹配数据集,以便输入格式现在与 MxNet 示例使用的格式相同。Mnisten 是一个很好的工作工具,重要的是不要忘记它将灰度像素标准化为 0..1 范围(不再是 0..255)。

它是一个命令行工具,但所有 C++ 代码都可用(如果它真的不多),转换器还可以与项目的现有代码集成以处理各种细节。我以前从未参与过这个项目。


推荐阅读