【问题标题】:MXNET multi-iterators (combine a .rec iterator with an NDArray iterator)MXNET 多迭代器(结合 .rec 迭代器和 NDArray 迭代器)
【发布时间】:2017-08-22 01:17:09
【问题描述】:

如何在 MXNET 中创建组合迭代器?例如,给定一个记录 (.rec) 迭代器,如果我想更改每个图像对应的标签,那么有两个选项: a) 使用相同的数据(图像)和新标签创建一个新的接收器。 b) 使用原始的rec 迭代器和一个NDArray 迭代器创建一个多重迭代器,这样多重迭代器从原始的.rec 迭代器中读取数据(图像)并从NDArray 迭代器中读取标签。 选项(a)是乏味的。关于如何创建这样的多迭代器有什么建议吗?

【问题讨论】:

    标签: mxnet


    【解决方案1】:
    class MultiIter(mx.io.DataIter):  
        def __init__(self, iter_list):  
            self.iters = iter_list   
            self.batch_size = 1000  
        def next(self):  
            batches = [i.next() for i in self.iters]  
            return mx.io.DataBatch(data=[t for t in batches[0].data]+ [t for t in batches[1].data], label= [t for t in batches[0].label] + [t for t in batches[1].label],pad=0)  
        def reset(self):  
            for i in self.iters:  
                i.reset()  
        @property  
        def provide_data(self):  
            return [t for t in self.iters[0].provide_data] + [t for t in self.iters[1].provide_data] 
        @property  
        def provide_label(self):  
            return [t for t in self.iters[0].provide_label] + [t for t in self.iters[1].provide_label]
    
    train = MultiIter([train1,train2])
    

    其中 train1 和 train2 可以是任意两个 DataIter。特别是,train1 可以是 .rec 迭代器,train2 可以是 NDArray 迭代器。如果 train1 或 train2 中的任何一个是 NDArray 迭代器,则使用组合迭代器调用 predict 方法时需要附加参数“pad=0”。

    MultiIter 返回由两个迭代器组合而成的数据列表和标签列表。如果您只需要来自第一个迭代器的数据和来自第二个迭代器的标签,则下面的代码将起作用。

    class MultiIter(mx.io.DataIter):  
        def __init__(self, iter_list):  
            self.iters = iter_list   
            self.batch_size = 1000  
        def next(self):  
            batches = [i.next() for i in self.iters]  
            return mx.io.DataBatch(data=[t for t in batches[0].data], label= [t for t in batches[1].label],pad=0)  
        def reset(self):  
            for i in self.iters:  
                i.reset()  
        @property  
        def provide_data(self):  
            return [t for t in self.iters[0].provide_data] 
        @property  
        def provide_label(self):  
            return [t for t in self.iters[1].provide_label] 
    
    train = MultiIter([train1,train2])
    

    【讨论】:

    • 如果有人可以编写一个多迭代器,其中两个迭代器可以同步洗牌,那将会很有趣。到目前为止,要使用这个 Multi-iterator shuffle 必须在两个迭代器中为 False。
    • 我这样做的方法是使用 scikit-learn 的 sklearn.util.shuffle(*args) 函数。但是如果你不想要这种依赖,如果你的所有迭代器都是可切片的,你可以创建一个索引器,它是索引数组的随机排列,然后用相同的数组切片所有子迭代器。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2010-10-27
    • 2018-05-16
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多