跳转到主要内容

DataStack,一种基于流的机器学习数据集检索和存储解决方案

项目描述

DataStack

一种基于流的机器学习数据集存储解决方案。

PyPI version CircleCI codecov

如今,机器学习数据集在互联网上丰富多样,格式也各式各样(例如,pandas数据框、CSV文件、numpy数组、Excel表格、h5py等),这使得通用数据集处理变得复杂。幸运的是,几乎所有最新的库都提供了将数据集作为二进制流加载和存储的文件接口,这也是DataStack建立的基础。在DataStack中,数据集以纯二进制流的形式存储,并通过针对每种文件类型特定的自定义迭代器加载。因此,存储本身完全独立于文件类型。如果迭代器支持,二进制流甚至可以懒加载。例如,H5Py文件格式就支持这一点。

DataStack的另一重要特性是它能够堆叠迭代器。以数据集迭代器为基础,可以堆叠自定义的高级迭代器,如允许任意数据集分割的迭代器视图和将数据集分割连接起来的组合迭代器。在其他采用DataStack的研究项目中,高级迭代器已经包括更复杂的迭代器,如特征编码迭代器和目标类映射迭代器。

那么,DataStack是如何融入到机器学习工程工作流程中的呢?虽然训练数据的获取不再成为限制,但将数据集整合到机器学习工作流程中仍然需要耗时的人工准备。在从一个项目或研究论文切换到另一个项目时,机器学习工程师和研究人员通常需要从头开始多次整合相同的数据集。DataStack通过提供稳定的数据访问接口,为整合这些数据集提供了解决方案,这些接口是机器学习算法可以与之交互的。有了这些接口,可以更轻松地重复使用数据集和复制结果。

DataStack提供以下关键模块

  • 数据集检索:可以通过HTTPRetriever检索数据集。如果需要自定义检索器,例如用于自定义数据库,只需实现Retriever接口即可。

  • 数据集存储:DataStack附带一个FileStorageConnector,用于使用预定义的数据集标识符将数据集存储到磁盘并从中加载数据。通过实现StorageConnector接口,可以支持任何其他自定义存储解决方案,例如MongoDB。值得注意的是,每个数据集都存储为StreamedResource,这是Python的IOBase的包装器。因此,相应的DatasetStorage不需要了解编码数据。这就是为什么存储不限于任何特定文件类型。此外,在访问文件存储时,仅创建对该文件的文件描述符,为迭代器提供懒加载。

  • 迭代器:DataStack提供迭代器接口和几个实现,用于遍历数据集。迭代器接受包含二进制数据集的StreamedResource,并提供一个迭代程序,该程序针对数据集的原始文件类型进行了定制。例如,二进制PyTorch张量流需要一个不同的迭代实现,而CSV流则需要不同的实现。请注意,StreamedResource只提供对流的文件描述符。如果该流存储在磁盘上,StreamedResource不会自动将流加载到内存中。这为使用例如h5py文件流等懒加载数据样本提供了机会。

安装

安装DataStack有两种选择,最简单的方法是从pip仓库安装。

pip install datastack

对于最新版本,可以直接从源代码安装,通过cd进入根目录,然后运行

pip install src/

使用方法

注意:此库仍在积极开发中。它可能不无错误,接口也可能仍然会发生变化。

要实现新的数据集,必须实现3个类

  • 数据集工厂:使用RetrieverPreprocessor实现以及StorageConnector检索、准备、存储和加载数据集。
  • 预处理:数据集通常被压缩、分割成许多文件或以未知结构存在。因此,对于每个数据集,我们需要一个预处理类,将数据集转换为StreamedResource
  • 迭代器:在二进制流StreamedResource上提供迭代实现。

DataStack提供了一个MNIST实现示例

版权

版权所有(c)2020 Max Lübbering。有关许可证信息,请参阅:https://github.com/le1nux/datastack/blob/master/LICENSE

由以下提供支持