OFRecord 数据格式
深度学习应用需要复杂的多阶段数据预处理流水线,数据加载是流水线的第一步,OneFlow 支持多种格式数据的加载,其中 OFRecord 格式是 OneFlow 原生的数据格式。
OFRecord 的格式定义参考了 TensorFlow 的 TFRecord,熟悉 TFRecord 的用户,可以很快上手 OneFlow 的 OFRecord。
本文将介绍:
• OFRecord 使用的数据类型
• 如何将数据转化为 OFRecord 对象并序列化
• OFRecord 文件格式
有助于学习加载与准备 OFRecord 数据集。
OFRecord 相关数据类型
OneFlow 内部采用Protocol Buffers 描述 OFRecord 的序列化格式。相关的 .proto 文件在 oneflow/core/record/record.proto 中,具体定义如下:
syntax = “proto2”;
package oneflow;

message BytesList {
repeated bytes value = 1;
}

message FloatList {
repeated float value = 1 [packed = true];
}

message DoubleList {
repeated double value = 1 [packed = true];
}

message Int32List {
repeated int32 value = 1 [packed = true];
}

message Int64List {
repeated int64 value = 1 [packed = true];
}

message Feature {
oneof kind {
BytesList bytes_list = 1;
FloatList float_list = 2;
DoubleList double_list = 3;
Int32List int32_list = 4;
Int64List int64_list = 5;
}
}

message OFRecord {
map<string, Feature> feature = 1;
}
先对以上的重要数据类型进行解释:
• OFRecord: OFRecord 的实例化对象,可用于存储所有需要序列化的数据。它由任意多个 string->Feature 的键值对组成;
• Feature: Feature 可存储 BytesList、FloatList、DoubleList、Int32List、Int64List 各类型中的任意一种;
• OFRecord、Feature、XXXList 等类型,均由 Protocol Buffers 生成对应的同名接口,使得可以在 Python 层面构造对应对象。
转化数据为 Feature 格式
可以通过调用 ofrecord.xxxList 及 ofrecord.Feature 将数据转为 Feature 格式,为了更加方便,需要对 protocol buffers 生成的接口进行简单封装:
import oneflow.core.record.record_pb2 as ofrecord

def int32_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.Feature(int32_list=ofrecord.Int32List(value=value))

def int64_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.Feature(int64_list=ofrecord.Int64List(value=value))

def float_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.Feature(float_list=ofrecord.FloatList(value=value))

def double_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.Feature(double_list=ofrecord.DoubleList(value=value))

def bytes_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
if not six.PY2:
if isinstance(value[0], str):
value = [x.encode() for x in value]
return ofrecord.Feature(bytes_list=ofrecord.BytesList(value=value))
创建 OFRecord 对象并序列化
在下例子中,将创建有2个 feature 的 OFRecord 对象,并且调用它的 SerializeToString 方法序列化。
obserations = 28 * 28

f = open("./dataset/part-0", “wb”)

for loop in range(0, 3):
image = [random.random() for x in range(0, obserations)]
label = [random.randint(0, 9)]

  topack = {"images": float_feature(image),"labels": int64_feature(label),}ofrecord_features = ofrecord.OFRecord(feature=topack)serilizedBytes = ofrecord_features.SerializeToString()

通过以上例子,可以总结序列化数据的步骤:
• 将需要序列化的数据,通过调用 ofrecord.Feature 及 ofrecord.XXXList 转为 Feature 对象;
• 将上一步得到的各个 Feature 对象,以 string->Feature 键值对的形式,存放在 Python 字典中;
• 调用 ofrecord.OFRecord 创建 OFRecord 对象
• 调用 OFRecord 对象的 SerializeToString 方法得到序列化结果
序列化的结果,可以存为 ofrecord 格式的文件。
OFRecord 格式的文件
将 OFRecord 对象序列化后按 OneFlow 约定的格式存文件,就得到 OFRecord文件 。
1个 OFRecord 文件中可存储多个 OFRecord 对象,OFRecord 文件可用于 OneFlow 数据流水线,具体操作可见加载与准备 OFRecord 数据集
OneFlow 约定,对于 每个 OFRecord 对象,用以下格式存储:
uint64 length
byte data[length]
即头8个字节存入数据长度,然后存入序列化数据本身。
length = ofrecord_features.ByteSize()

f.write(struct.pack(“q”, length))
f.write(serilizedBytes)
代码
以下完整代码展示如何生成 OFRecord 文件,并调用 protobuf 生成的 OFRecord 接口手工读取 OFRecord 文件中的数据。
实际上,OneFlow 提供了 flow.data.decode_ofrecord 等接口,可以更方便地提取 OFRecord 文件(数据集)中的内容。详细内容请参见加载与准备 OFRecord 数据集。
将 OFRecord 对象写入文件
以下脚本,模拟了3个样本,每个样本为28*28的图片,并且包含对应标签。将三个样本转化为 OFRecord 对象后,按照 OneFlow 约定格式,存入文件。
代码:ofrecord_to_string.py
从 OFRecord 文件中读取数据
以下脚本,读取上例中生成的 OFRecord 文件,调用 FromString 方法反序列化得到 OFRecord 对象,并最终显示数据:
代码:ofrecord_from_string.py

OFRecord 数据格式相关推荐

  1. OFRecord 图片文件制数据集

    OFRecord 图片文件制数据集 在 OFRecord 数据格式 和 加载与准备 OFRecord 数据集 中,分别学习了 OFRecord 数据格式,以及如何将其它数据集转为 OFRecord 数 ...

  2. OFRecord 数据集加载

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

  3. TensorRT 数据格式说明

    TensorRT 数据格式说明 NVIDIA ® TensorRT™支持不同的数据格式.需要考虑两个方面:数据类型和布局. 数据类型格式 数据类型是每个单独值的表示.它的大小决定了数值的范围和表示的精 ...

  4. XML和JSON数据格式对比

    概念 XML 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语 ...

  5. 客户资料查询传递数据格式

    客户资料查询传递数据格式 大家好! 客户资料查询字段JSON格式如下(附件为数据文件): [ { "colName":"CUSTTEL", "colT ...

  6. can是什么时候处于显性_can总线怎么传输数据格式过程分析

    一.什么是CAN协议 电子计算机网络用电子语言来说话,各电控单元必须使用和解读相同的电子语言,这种语言称"协议",汽车电脑网络常见的传输协议有数种.宝来车装用博世公司产品,数据总线 ...

  7. c语言gps数据类型,GPS数据格式

    该协议信息包括GGA位置测定系统的定位资料.GSV导航卫星资料.RMC导 航卫星特定精简资料.VTG方向及速度等相关资料.这里以接收GGA数据为例, 给出的格式如下: $GPGGA, hhmmss,d ...

  8. byte数组穿换成pcm格式_Apache Arrow:一种适合异构大数据系统的内存列存数据格式标准...

    作者 | 伴鱼技术团队 策划 | 钰莹 本文介绍一种内存列存数据格式:Apache Arrow,它有一个非常大的愿景:提供内存数据分析 (in-memory analytics) 的开发平台,让数据在 ...

  9. ASP.NET设置数据格式与String.Format使用总结

    {0:d} YY-MM-DD {0:p} 百分比00.00% {0:N2} 12.68 {0:N0} 13 {0:c2} $12.68 {0:d}  3/23/2003 {0:T}  12:00:00 ...

最新文章

  1. 【连载】优秀程序员的 45 个习惯之习惯27
  2. html前端登录验证码,前端登录页面开发_js生成验证码并验证
  3. SAP歷史更改記錄函數
  4. 【译】Writing a Simple Linux Kernel Module
  5. mysql 视图慢_第03问:磁盘 IO 报警,MySQL 读写哪个文件慢了?
  6. left join后边跟on...and 和where...and的区别
  7. 网易云音乐ubuntu 18.04下无法打开的解决办法
  8. 微信hash ajax,基于vue hash模式微信分享#号的解决
  9. JavaScript的String对象使用
  10. webpack 修改title_Webpack漫谈
  11. leetcode1088
  12. dnf加点模拟器最新版85级版
  13. Permute 3 for mac(万能音视频转换器)
  14. R语言(三) 你是我唯一的光 | 基于《白夜行》的文本可视化分析
  15. 怎么用计算机表达爱意,不知道如何向心仪的她表达爱意的你 可能需要Zooids这帮小助攻...
  16. 5G、AI、物联网、AR、VR入围2019年度十大科技热词
  17. 如何将word转换成excel格式
  18. /usr/local/go/src/net/cgo_linux.go:12:8: no such package located
  19. Ubuntu16.04 安装 CUDA、CUDNN、OpenCV 并用 Anaconda 配置 Tensorflow 和 Caffe 详细过程(此种方案不好,好的方案是另一篇,基于pyhton2的)
  20. Docker 从入门到精通

热门文章

  1. Java Random()函数生成指定范围的随机数
  2. 广东java工资一般多少_广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少...
  3. Go 知识点(15)— 切片长度和容量
  4. OneFlow 概念清单
  5. 旷视MegEngine数据加载与处理
  6. 英特尔 i5-9400F,或将成为本年最高性价比的游戏处理器
  7. SOC,System on-a-Chip技术初步
  8. 2021年大数据Kafka(六):❤️安装Kafka-Eagle❤️
  9. 2021年大数据Flink(二十三):​​​​​​​Watermaker案例演示
  10. ajax ie7没有权限,jquery ajax 在ie7不能正常使用