c++ - 如何在 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 工具。
解决方案
最终,我使用Mnisten生成匹配数据集,以便输入格式现在与 MxNet 示例使用的格式相同。Mnisten 是一个很好的工作工具,重要的是不要忘记它将灰度像素标准化为 0..1 范围(不再是 0..255)。
它是一个命令行工具,但所有 C++ 代码都可用(如果它真的不多),转换器还可以与项目的现有代码集成以处理各种细节。我以前从未参与过这个项目。
推荐阅读
- java - 在 Spring 集成中解组其 Xml 有效负载后如何保留 JMS 标头
- elasticsearch - 当我将它与脚本类型更新结合使用时,如何获得文档类型更新功能?
- python - btn.pack() 中的按钮缺少位置参数“self”
- java - 由 Android Java 调用的 Swig 包装的 Rust 代码需要未编码的符号“log”
- javascript - 这段代码'true <=> false'是什么意思
- python - 有时当我尝试将文件下载到 ftp 时出现错误:550 访问被拒绝。但有时一切都是工作
- c# - 如何删除没有视频 ID 的可恢复上传?
- regex - 在primefaces keyfilter中允许“&”字符
- javascript - 登录后我无法重定向用户
- node.js - 无法在谷歌云功能中安装 npm 包