Something in Python

===== 持续更========

一. iterator

deep learning for nlp, 在构建模型之后,总是设计到数据处理的问题,需要将很大的文件split为一个个的batch, 用一个迭代器来做这件事情,代码看起来显得异常优雅,那么如果来构建自己的迭代器呢?我们来看一下python迭代器实现的内部机制。
我们比较常见到的迭代器的形式是:for i in obj
程序在执行这句话的时候,底层代码其实执行的是这样的:

_iter = obj.__iter__()  
while true:  
    try:  
        x = _iter.next()  
    except StopIteration:  
        break  
# statements 

从上面的例子可以看出来,实现一个迭代器,需要实现_iter_()方法和next(), 以及终止条件StopIteration
其中iter()方法返回迭代器类本身,而next方法则是返回每次需要的元素。

那么比如在深度学习中,batch处理数据,就需要这样的迭代器来处理数据,刚好最近在做的一个小事情需要写一个,读取数据,使用的是numpy的loadtx,代码如下:

class Hidden_iterator(object):
    def __init__(self, source, soure2, label,
                 batch_size=128):
        self.source_file = source
        self.target_file = soure2
        self.label_file = label
        self.batch_size = batch_size

        self.end_of_data = False
        self.start_position = 0

        # ### 读取文件
        self.source = np.loadtxt(self.source_file)
        self.target = np.loadtxt(self.target_file)
        self.label = np.loadtxt(self.label_file, dtype=int)
        self.end = self.source.shape[0]

    def __iter__(self):
        return self

    def __next__(self):
        return self.next()

    def next(self):

        if self.end_of_data:
            raise StopIteration

        ss = self.start_position
        ee = self.start_position + self.batch_size
        self.start_position += self.batch_size
        if ee >= self.end:
            self.end_of_data = True
            ss = self.end - self.batch_size

        return self.source[ss:ee], self.target[ss:ee], self.label[ss:ee]

猜你喜欢

转载自blog.csdn.net/u011415481/article/details/78940824