一种数据处理流水线和迭代器,具有最小的机器学习依赖性。
Lunas的Python项目详细描述
月球
lunas是一个基于python 3的库,它为数据处理管道提供一组简单的接口,并为数据循环提供一个迭代器。
基本上,lunas在tensorflow、pytorch上绘制了它的数据处理样式,以及allennlp中的一些实现细节。
概述
Reader
定义一个数据集以及相应的预处理和过滤管道。目前支持以下功能:
- 缓冲读取。
- 缓冲洗牌。
- 链式处理和过滤接口。
- 并行地对数据缓冲区进行预处理和过滤。
- 处理多个输入源。
- 持久的。
Iterator
在数据集上执行任意迭代并保持迭代状态:
- 运行时动态批处理。
- 自定义停止条件。
- 对批处理的样本进行排序,这对于学习pytorch中rnns的文本表示非常有用。
- 持久的。
GroupIterator
一次产生多个批次,
适用于有限计算资源下的模拟大批量训练。
Distributed
为分布式训练拆分读卡器。
persistable为类提供了一个与pytorch兼容的接口,用于转储和加载实例状态,在培训过程意外中止时非常有用。
要求
- 努比
- 覆盖
- 打字
- python=3.7
Lunas几乎不依赖任何第三方库,所有需要的库都是 利用python 3提供的类型提示特性。
该项目使用了类型提示功能,python版本低于3.7的内置类型模块会降低性能。然而,这是从python 3.7开始解决的。因此Lunas目前需要Python3.7才能高效工作。
安装
您只需运行pip:
pip install lunas
示例
lunas向用户公开最少的接口,以便使其尽可能简单。我们尽量避免添加任何不必要的功能,以保持它的重量轻。
但是,您仍然可以扩展此库以满足您随时处理任意数据类型(如文本、图像和音频)的需要。
创建一个数据集读取器并遍历它。
fromlunasimportRangeds=Range(10)forsampleinds:print(sample)forsampleinds:print(sample)
- 我们创建一个类似于range(10)的数据集,并在其中迭代一个epoch。 如您所见,我们可以多次遍历此数据集。
建立数据处理管道。
ds=Range(10).select(lambdax:x+1).select(lambdax:x*2).where(lambdax:x%2==0)
- 我们调用
Reader.select(fn)
来定义数据集的处理过程。 select()
返回数据集本身以启用链接调用。您可以对数据集应用任何转换并返回任何类型的示例,例如Dict
、List
和自定义Sample
。where()
接受谓词并返回bool
值以筛选输入样本,如果为true,则保留样本,否则丢弃。- 应该注意的是,处理不是立即执行的,而是在遍历
ds
时执行的。
- 我们调用
处理多个输入源。
fromlunasimportRange,Zip,Shuffleds1=Range(10)ds2=Range(10)ds=Zip(ds1,ds2).select(lambdax,y:x+y)ds=Shuffle(ds)
- 在上面的代码中,我们创建了两个数据集和zip它们作为
Zip
读取器。一个Zip
读取器从其内部readers
返回一个元组。 Shuffle
对数据集执行随机洗牌。
- 在上面的代码中,我们创建了两个数据集和zip它们作为
机器翻译场景中的实际用例。
fromlunasimportTextLine,Iterator# Tokenize the input into a list of tokens.source=TextLine('train.fr').select(lambdax:x.split())target=TextLine('train.en').select(lambdax:x.split())# Ensure the inputs are of length no exceeding 50.ds=Zip(source,target).select(lambdax,y:{x:src_vocab.convert(x),y:trg_vocab.covert(y),size_x:len(x),size_y:len(y),})ds=ds.where(lambdax:max(x['size_x'],x['size_y'])<=50)# Map word to id.ds=Shuffle(ds,shufsize=-1)# Convert a list of samples to model inputscollate_fn=lambdax:...# Sort samples in batch by source text lengthsort_key=lambdax:len(x['size_x'])it=Iterator(ds,batch_size=4096,cache_size=4096*32,sample_size_fn=lambdax:x['size_x'],collate_fn=collate_fn,sort_cache_by=sort_key)# Iterate 100 epoch and 1000000 steps at most.forbatchinit.while_true(lambda:it.epoch<100andit.step<1e6):print(it.epoch,it.step,it.step_in_epoch,batch)
- 即使你不熟悉机器翻译,这段代码也应该足够简单易懂。
保存并重新加载迭代状态。
importpicklepickle.dump(it.state_dict(),open('state.pkl','wb'))# ...state=pickle.load(open('state.pkl','rb'))it.load_state_dict(state)
state_dict()
返回一个可选择的字典,该字典可由it.load_state_dict()
加载以继续稍后的迭代过程。
扩展读卡器。
- 您可以参考
Text
reader的实现来定制您自己的数据读取器。
- 您可以参考
结论
如果您有任何问题或发现任何Lunas病毒,请随时与我联系。