OFRecord 数据集加载

数据输入一文中知道了使用 DataLoader 及相关算子加载数据,往往效率更高,并且学习了如何使用 DataLoader 及相关算子。

在 OFrecord 数据格式中,学习了 OFRecord 文件的存储格式。

本文,将围绕 OneFlow 的 OFRecord 数据集的加载与制作展开,主要包括:

  • OFRecord 数据集的组织形式
  • 加载 OFRecord 数据集的多种方式
  • OFRecord 数据集与其它数据格式的相互转化

什么是OFRecord数据集

在 OFrecord 数据格式中已经介绍过 OFRecord 文件 的存储格式,知道了什么是 OFRecord文件。

OFRecord 数据集是 OFRecord 文件的集合 。将多个 OFRecord文件,按照 OneFlow 约定的文件名格式,存放在同一个目录中,就得到了 OFRecord 数据集。

默认情况下,OFRecord 数据集目录中的文件,统一以 part-xxx 的方式命名,其中的 "xxx" 是从0开始的文件编号,有补齐和不补齐两种选择。

以下是没有采用补齐的命名风格示例:

mnist_kaggle/train/

├── part-0

├── part-1

├── part-10

├── part-11

├── part-12

├── part-13

├── part-14

├── part-15

├── part-2

├── part-3

├── part-4

├── part-5

├── part-6

├── part-7

├── part-8

└── part-9

以下是有补齐的命名风格:

mnist_kaggle/train/

├── part-00000

├── part-00001

├── part-00002

├── part-00003

├── part-00004

├── part-00005

├── part-00006

├── part-00007

├── part-00008

├── part-00009

├── part-00010

├── part-00011

├── part-00012

├── part-00013

├── part-00014

├── part-00015

OneFlow 采用此约定,与 spark 的默认存储的文件名一致,方便使用 spark 制作与转化 OFRecord 数据。

实际上,文件名前缀(part-)、文件名编号是否补齐、按多少位补齐,均可以自行指定,只需要在加载数据集(下文会介绍)时,保持相关参数一致即可。

OneFlow 提供了加载 OFRecord 数据集的接口,使得只要指定数据集目录的路径,就可以享受 OneFlow 框架所带来的多线程、数据流水线等优势。

加载OFRecord数据集的方法

使用 ofrecord_reader 加载并预处理数据集。

数据输入一文中,已经展示了如何使用 ofrecord_reader 接口加载 OFRecord 数据,并进行数据预处理。

代码见:of_data_pipeline.py

ofrecord_reader 的接口如下:

def ofrecord_reader(

ofrecord_dir,

batch_size=1,

data_part_num=1,

part_name_prefix="part-",

part_name_suffix_length=-1,

random_shuffle=False,

shuffle_buffer_size=1024,

shuffle_after_epoch=False,

name=None,

)

  • ofrecord_dir 指定存放数据集的目录路径
  • batch_size 指定每轮读取的 batch 大小
  • data_part_num 指定数据集目录中一共有多少个 ofrecord 格式的文件,如果这个数字大于真实存在的文件数,会报错
  • part_name_prefix 指定 ofrecord 文件的文件名前缀, OneFlow 根据前缀+序号在数据集目录中定位 ofrecord 文件
  • part_name_suffix_length 指定 ofrecord 文件的序号的对齐长度,-1表示不用对齐
  • random_shuffle 表示读取时是否需要随机打乱样本顺序
  • shuffle_buffer_size 指定了读取样本的缓冲区大小
  • shuffle_after_epoch 表示每轮读取完后是否需要重新打乱样本顺序

使用 ofrecord_reader 的好处在于, ofrecord_reader 作为一个普通算子,参与 OneFlow 构图优化,并享有 OneFlow 流水线加速。

对于与业务逻辑耦合的特定操作(如解码、解压等),还可以为 ofrecord_reader 定义预处理 op,让程序拥有很高的灵活性和扩展性。

其它格式数据与 OFRecord 数据集的相互转化

参考OFrecord数据格式中 OFRecord 文件的存储格式及本文开头介绍的 OFRecord 数据集的文件名格式约定,完全可以自己制作 OFRecord 数据集。

不过为了更加方便,提供了 Spark 的 jar 包,方便 OFRecord 与常见数据格式(如 TFRecord、json)进行相互转化。

spark 的安装与启动

首先,下载 spark 及 spark-oneflow-connector:

接着,解压 spark-2.4.0-bin-hadoop2.7.tgz,并配置环境变量 SPARK_HOME:

export SPARK_HOME=path/to/spark-2.4.0-bin-hadoop2.7

然后,通过以下命令启动 pyspark shell:

pyspark --master "local[*]"\

--jars spark-oneflow-connector-assembly-0.1.0_int64.jar\

--packages org.tensorflow:spark-tensorflow-connector_2.11:1.13.1

...

Welcome to

____              __

/ __/__  ___ _____/ /__

_\ \/ _ \/ _ `/ __/  '_/

/__ / .__/\_,_/_/ /_/\_\   version 2.4.0

/_/

Using Python version 3.6.10 (default, May  8 2020 02:54:21)

SparkSession available as 'spark'.

>>>

在启动的 pyspark shell 中,可以完成 OFRecord 数据集与其它数据格式的相互转化。

使用 spark 查看 OFRecord 数据集

使用以下命令可以查看 OFRecord 数据:

spark.read.format("ofrecord").load("file:///path/to/ofrecord_file").show()

默认显示前20条数据:

+--------------------+------+

|              images|labels|

+--------------------+------+

|[0.33967614, 0.87...|     2|

|[0.266905, 0.9730...|     3|

|[0.66661334, 0.67...|     1|

|[0.91943026, 0.89...|     6|

|[0.014844197, 0.0...|     6|

|[0.5366513, 0.748...|     4|

|[0.055148937, 0.7...|     7|

|[0.7814437, 0.228...|     4|

|[0.31193638, 0.55...|     3|

|[0.20034336, 0.24...|     4|

|[0.09441255, 0.07...|     3|

|[0.5177533, 0.397...|     0|

|[0.23703437, 0.44...|     9|

|[0.9425567, 0.859...|     9|

|[0.017339867, 0.0...|     3|

|[0.827106, 0.3122...|     0|

|[0.8641392, 0.194...|     2|

|[0.95585227, 0.29...|     3|

|[0.7508129, 0.464...|     4|

|[0.035597708, 0.3...|     9|

+--------------------+------+

only showing top 20 rows

与 TFRecord 数据集的相互转化

以下命令可以将 TFRecord 转化为 OFRecrod:

reader = spark.read.format("tfrecords")

dataframe = reader.load("file:///path/to/tfrecord_file")

writer = dataframe.write.format("ofrecord")

writer.save("file:///path/to/outputdir")

以上代码中的 outputdir 目录会被自动创建,并在其中保存 ofrecord 文件。在执行命令前应保证 outputdir 目录不存在。

此外,还可以使用以下命令,在转化的同时,将数据切分为多个 ofrecord 文件:

reader = spark.read.format("tfrecords")

dataframe = reader.load("file:///path/to/tfrecord_file")

writer = dataframe.repartition(10).write.format("ofrecord")

writer.save("file://path/to/outputdir")

以上命令执行后,在 outputdir 目录下会产生10个 part-xxx 格式的ofrecord文件。

将 OFRecord 文件转为 TFRecord 文件的过程类似,交换读/写方的 format 即可:

reader = spark.read.format("ofrecord")

dataframe = reader.load("file:///path/to/ofrecord_file")

writer = dataframe.write.format("tfrecords")

writer.save("file:///path/to/outputdir")

与 JSON 格式的相互转化

以下命令可以将 JSON 格式数据转为 OFRecord 数据集:

dataframe = spark.read.json("file:///path/to/json_file")

writer = dataframe.write.format("ofrecord")

writer.save("file:///path/to/outputdir")

以下命令将 OFRecord 数据转为 JSON 文件:

reader = spark.read.format("ofrecord")

dataframe = reader.load("file:///path/to/ofrecord_file")

dataframe.write.json("file://path/to/outputdir")

OFRecord 数据集加载的更多相关文章

  1. 什么是pytorch(4.数据集加载和处理)(翻译)

    数据集加载和处理 这里主要涉及两个包:torchvision.datasets 和torch.utils.data.Dataset 和DataLoader torchvision.datasets是一 ...

  2. PIE SDK 多数据源的复合数据集加载

    1. 功能简介 GIS遥感图像数据复合是将多种遥感图像数据融合成一种新的图像数据的技术,是目前遥感应用分析的前沿,PIESDK通过复合数据技术可以将多幅幅影像数据集(多光谱和全色数据)组合成一幅多波段 ...

  3. tensorflow数据集加载

    本篇涉及的内容主要有小型常用的经典数据集的加载步骤,tensorflow提供了如下接口:keras.datasets.tf.data.Dataset.from_tensor_slices(shuffl ...

  4. [深度学习]-Dataset数据集加载

    加载数据集dataloader from torch.utils.data import DataLoader form 自己写的dataset import Dataset train_set = ...

  5. las数据集加载las数据

    引用的类库:ESRI.ArcGIS.GeoDatabaseExtensions 逻辑步骤: 1.创建las数据集(ILasDataset). 2.实例化las数据集的编辑器(ILasDatasetEd ...

  6. pytorch 加载数据集

    pytorch初学者,想加载自己的数据,了解了一下数据类型.维度等信息,方便以后加载其他数据. 1 torchvision.transforms实现数据预处理 transforms.Totensor( ...

  7. TensorFlow2.0(10):加载自定义图片数据集到Dataset

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  8. [Python]-sklearn模块-机器学习Python入门《Python机器学习手册》-02-加载数据:加载数据集

    <Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...

  9. BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库

    介绍 通常情况下,报告需要在一个类似树的结构来显示数据.通过启用此特性在SAP BW层次结构.高级数据显示的层次结构的顶层节点.更详细的数据可以向下钻取到的层次结构中的下级节点的可视化. 考虑一个例子 ...

随机推荐

  1. 0-0 Linux安装在VMvare虚拟机上

    一.安装VMware虚拟机: 双击, 上面一步会提示你输入密钥,你只要双击这个,复制里面的一串码粘贴进去就可以. 点击完成,至此VM虚拟机安装完成. 二.在VMvare虚拟机上安装centos. 1. ...

  2. 限制pyqt5应用程序 只允许打开一次

    起因 pyqt5程序创建桌面快捷方式后,多次单击图标 会打开多个UI界面,这种情况肯定是不允许的! 解决 if __name__ == '__main__': try: app = QtWidgets ...

  3. 【接口参数解析BUG】SpringMVC接口参数解析

    今天遇到一个BUG,前端传递数字数组时,后端使用字符串类型去接收,结果无法接收到,代码如下 问题: GET请求: 前端: configJsonArray:[1,2] 后端: private Strin ...

  4. hdu4810

    题意:      给你n个数,让你输出n个数,没一次输出的是在这n个数里面取i个数异或的和(所有情况<C n中取i>). 思路:      首先把所有的数都拆成二进制,然后把他们在某一位上 ...

  5. 从苏宁电器到卡巴斯基第27篇:难忘的三年硕士时光 V

    一发不可收拾 安全领域的公司都喜欢在看雪或者是吾爱破解这样的网站上发布招聘贴,因为这样的话很容易就能够招到适合的人才,也算是精准营销了.而像我这种想进入安全圈的,也会在这里发布自己的求职简历,以期望能 ...

  6. 网络基础概念(IP、MAC、网关、子网掩码)

    目录 IP地址 MAC地址 网关 子网掩码 反子网掩码 子网掩码 子网划分一: 子网划分二: 子网汇聚 广播域 冲突域 CSMA/CD IP地址 ip地址是用于标识网络中每台设备的标识.目前 IPV4 ...

  7. MySQL UDF提权执行系统命令

    目录 UDF UDF提权步骤 UDF提权复现(php环境) UDF UDF (user defined function),即用户自定义函数.是通过添加新函数,对MySQL的功能进行扩充,其实就像使用 ...

  8. Python技术栈性能测试工具Locust入门

    Locust是一款Python技术栈的开源的性能测试工具.Locust直译为蝗虫,寓意着它能产生蝗虫般成千上万的并发用户: Locust并不小众,从它Github的Star数量就可见一斑: 截止文章写 ...

  9. 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和

    [JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...

  10. locustfile中的User类和HttpUser类

    locustfile是什么? locustfile是Locust性能测试工具的用户脚本,描述了单个用户的行为. locustfile是个普通的Python模块,如果写作locustfile.py,那么 ...