美文网首页mxnet
MxNet源码解析(5) io

MxNet源码解析(5) io

作者: Junr_0926 | 来源:发表于2018-09-14 17:33 被阅读0次

1. 前言

数据的读取很大程度上决定了代码运行的快慢。
先从python端的data io开始。在MXNet的python文件夹中,io.py定义了io需要的函数,其中_init_to_moduel会在我们import该包的时候运行,它的函数体如下:

def _init_io_module():
    """List and add all the data iterators to current module."""
    plist = ctypes.POINTER(ctypes.c_void_p)()
    size = ctypes.c_uint()
    check_call(_LIB.MXListDataIters(ctypes.byref(size), ctypes.byref(plist))) # 查看一共注册了多少个迭代器
    module_obj = sys.modules[__name__]
    for i in range(size.value):
        hdl = ctypes.c_void_p(plist[i])
        dataiter = _make_io_iterator(hdl)
        setattr(module_obj, dataiter.__name__, dataiter) # 将迭代器注册到包名下

该函数会将注册的迭代器都在io的名字空间下注册。注册之前,会使用MXDataIter进行包装,也就是说当我们在调用例如ImageRecordIter的方法的时候,其实调用的是MXDataIter的方法。
在初始化的时候,会调用Init方法,在调用next的时候,会调用对应的Next方法,在调用reset的时候会调用BeforeFirst

2. data.h

定义了迭代器的接口。

  • DataIter:定义了数据迭代器的接口
    • BeforeFirst 开始迭代之前的准备,reset调用。
    • Next 返回下一个数据
    • Value 返回当前数据
  • class Row

3. io.h

MXnet中的迭代器

  • IIterator

  • DataInst:单个数据的结构体表示

  • DataBatch:NDArray的DataBatch表示,由Iterator返回

4. augmenter

MXNet中定义了数据增强的迭代器,在源码中主要定义了两个增强的方法,一个是image_aug_default.cc,一个image_det_aug_default

4.1 image_aug_default.cc

  • struct DefaultImageAugmentParam : public dmlc::Parameter<DefaultImageAugmentParam>:定义了augmentation需要的参数,Parameterdmlc中定义的一个基础结构体,用于定义参数。在文件parameter.h中定义了该结构体,需要了解的是DMLC_REGISTER_PARAMETER, DMLC_DECLARE_PARAMETER, DMLC_DECLARE_FIELD的作用
    • DMLC_DECLARE_PARAMETER:给定parameter的名称,用于定义这个parameter,该宏会创建一个静态函数:static ::dmlc::parameter::ParamManager *__MANAGER__();,这个__MANAGER__函数会返回一个类型为ParamManager的变量。接着,宏会定义另一个函数:__DECLARE__,函数体在后面的括号中。
    • DMLC_DECLARE_FIELD:用于创建参数的一个域,也就是一个具体的参数。调用方法:this->DECLARE(manager, #FieldName, FieldName),这个方法的定义如下:
template<typename DType>
  inline parameter::FieldEntry<DType>& DECLARE(
      parameter::ParamManagerSingleton<PType> *manager,
      const std::string &key, DType &ref) { // NOLINT(*)
    parameter::FieldEntry<DType> *e =
        new parameter::FieldEntry<DType>();
    e->Init(key, this->head(), ref);
    manager->manager.AddEntry(key, e);
    return *e;
  }
  • DMLC_REGISTER_PARAMETER:用于注册这个参数,它会定义__MANAGER__函数
    (//TODO)
  • DefaultImageAugmenter定义了数据增强的方法,它继承自ImageAugmenter

5. iter_image_recordio.cc

5.1 Init

初始化函数会首先初始化未定义的参数,然后使用参数初始化parser_。接着会初始化iter_,它的定义:dmlc::ThreadIter<std::vector<InstVector<DType>> > iter_;

6. inst_vector.h

TensorVector:由一组Tensor组成的vector,支持不同shape

InstVector:由一组(label, example)组成的列表

7. threaditer.h

定义了类:ThreadedIter,在该类的内部定义了内部类:Producer

  • Init

8. im2rec

相关文章

  • MxNet源码解析(5) io

    1. 前言 数据的读取很大程度上决定了代码运行的快慢。先从python端的data io开始。在MXNet的pyt...

  • ConcurrentHashMap源码解析

    本篇出处ConcurrentHashMap源码解析[https://shenyifengtk.github.io/...

  • MxNet源码解析(1) KVStore,pslite源码解析

    1. 前言 从毕业开始工作已经两个多月,这期间相当一部分的时间都用在了对MxNet的学习上,而在MxNet的众多部...

  • MxNet源码解析(2) symbol

    1. 前言 我们在训练之前,先建立好一个图,然后我们可以在这个图上做我们想做的优化,这种形式称为Symbolic ...

  • MxNet源码解析(3) engine

    1. 前言 2. Engine 在MXNet的官网对Engine有一定的介绍,首先我们要知道Engine是用于并行...

  • MxNet源码解析(4) executor

    1. 前言 executor在MXnet中扮演着连接各个组件的作用,它根据symbol构建graph,它通过方法f...

  • MxNet源码解析(6) registry

    1. 前言 在MXNet中处处都用到了registry,因此有必要了解一下它的实现和用法。 2. registry...

  • 2019-02-19

    Ubuntu16.04 源码安装MXNet [参考官方教程](https://mxnet.incubator.ap...

  • 1.准备工作

    辅助教材 为Vue.js 源码解析 https://ustbhuangyi.github.io/vue-analy...

  • Mxnet 源码下载、编译、测试

    Mxnet 源码下载、编译、测试 1、前提:安装了opencv 、cuda 2、源码下载 git clone --...

网友评论

    本文标题:MxNet源码解析(5) io

    本文链接:https://www.haomeiwen.com/subject/zncbgftx.html