####一. 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]