一种数据处理流水线和迭代器,具有最小的机器学习依赖性。

Lunas的Python项目详细描述


月球

PyPI version

lunas是一个基于python 3的库,它为数据处理管道提供一组简单的接口,并为数据循环提供一个迭代器。

基本上,lunas在tensorflowpytorch上绘制了它的数据处理样式,以及allennlp中的一些实现细节。

概述

Reader定义一个数据集以及相应的预处理和过滤管道。目前支持以下功能:

  1. 缓冲读取。
  2. 缓冲洗牌。
  3. 链式处理和过滤接口。
  4. 并行地对数据缓冲区进行预处理和过滤。
  5. 处理多个输入源。
  6. 持久的。

Iterator在数据集上执行任意迭代并保持迭代状态:

  1. 运行时动态批处理。
  2. 自定义停止条件。
  3. 对批处理的样本进行排序,这对于学习pytorch中rnns的文本表示非常有用。
  4. 持久的。

GroupIterator一次产生多个批次, 适用于有限计算资源下的模拟大批量训练。

Distributed为分布式训练拆分读卡器。

persistable为类提供了一个与pytorch兼容的接口,用于转储和加载实例状态,在培训过程意外中止时非常有用。

要求

  • 努比
  • 覆盖
  • 打字
  • python=3.7

Lunas几乎不依赖任何第三方库,所有需要的库都是 利用python 3提供的类型提示特性。

该项目使用了类型提示功能,python版本低于3.7的内置类型模块会降低性能。然而,这是从python 3.7开始解决的。因此Lunas目前需要Python3.7才能高效工作。

安装

您只需运行pip:

pip install lunas

示例

lunas向用户公开最少的接口,以便使其尽可能简单。我们尽量避免添加任何不必要的功能,以保持它的重量轻。

但是,您仍然可以扩展此库以满足您随时处理任意数据类型(如文本、图像和音频)的需要。

  1. 创建一个数据集读取器并遍历它。

    fromlunasimportRangeds=Range(10)forsampleinds:print(sample)forsampleinds:print(sample)
    • 我们创建一个类似于range(10)的数据集,并在其中迭代一个epoch。 如您所见,我们可以多次遍历此数据集。
  2. 建立数据处理管道。

    ds=Range(10).select(lambdax:x+1).select(lambdax:x*2).where(lambdax:x%2==0)
    • 我们调用Reader.select(fn)来定义数据集的处理过程。
    • select()返回数据集本身以启用链接调用。您可以对数据集应用任何转换并返回任何类型的示例,例如DictList和自定义Sample
    • where()接受谓词并返回bool值以筛选输入样本,如果为true,则保留样本,否则丢弃。
    • 应该注意的是,处理不是立即执行的,而是在遍历ds时执行的。
  3. 处理多个输入源。

    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对数据集执行随机洗牌。
  4. 机器翻译场景中的实际用例。

    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)
    • 即使你不熟悉机器翻译,这段代码也应该足够简单易懂。
  5. 保存并重新加载迭代状态。

    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()加载以继续稍后的迭代过程。
  6. 扩展读卡器。

    • 您可以参考Textreader的实现来定制您自己的数据读取器。

结论

如果您有任何问题或发现任何Lunas病毒,请随时与我联系。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java getResourceAsStream()返回内容为空的流   java用小数组替换大数组或映射的一部分   java如何获得安卓的运营商功能   在Java中,可以从数组中的值一次分配给多个变量吗?   java Spring透视图没有在eclipse中显示   Java中的通用LinkedList克隆   java确实避开了线程的分析处理。holdsLock()正确吗?   java SocketInputStream。客户端使用jax rs向服务器发送请求时,socketRead0挂起   java从扫描仪读取多个输入   java Siddhi是否无法按多个变量分组?   java字符串将不会绘制   如何在Java中遍历属性文件中的值   对象列表的java JSON字符串   JavaGridLayout不考虑给定的行数和列数   java SSL:解析证书时出错:确定   java检查Hashmap中的键是否在AutoCompleteTextView中键入   java如何从HTML服务器获取JSON对象作为响应   Java对于类型列表<Object>   在AnyLogic中与外部java应用程序一起使用ExperimentRunFast