Path: blob/master/site/zh-cn/io/tutorials/avro.ipynb
25118 views
Copyright 2020 The TensorFlow IO Authors.
Avro 数据集 API
文本特征向量
Avro 数据集 API 的目标是将 Avro 格式的数据作为 TensorFlow 数据集原生加载到 TensorFlow 中。Avro 是一个类似于 Protocol Buffers 的数据序列化系统。它广泛用于 Apache Hadoop,可以提供持久数据的序列化格式和 Hadoop 节点之间通信的有线格式。Avro 数据是一种面向行的压缩二进制数据格式。它依赖于存储为单独 JSON 文件的架构。有关 Avro 格式和架构声明的规范,请参阅官方手册。
安装软件包
安装所需的 tensorflow-io 软件包
导入软件包
验证 tf 和 tfio 导入
用法
探索数据集
为了实现本教程的目的,我们来下载示例 Avro 数据集。
下载示例 Avro 文件:
下载示例 Avro 文件的相应架构文件:
在上面的示例中,基于 MNIST 数据集创建了一个测试 Avro 数据集。TFRecord 格式的原始 MNIST 数据集从 TF 命名数据集生成。但是,作为演示数据集,MNIST 数据集过大。为简单起见,我们修剪了大部分内容,只保留前几条记录。此外,对原始 MNIST 数据集中的 image
字段进行了额外的修剪,并将其映射到 Avro 中的 features
字段。因此,Avro 文件 train.avro
有 4 条记录,每条记录有 3 个字段,分别为:features
(整数的数组)、label
(整数或 null 的数组)和 dataType
(枚举)。要查看解码的 train.avro
(请注意,原始 Avro 数据文件非人类可读,因为 Avro 是压缩格式),请执行以下操作:
安装读取 Avro 文件所需的包:
要以人类可读的格式读取和打印 Avro 文件,请运行以下代码:
由 train.avsc
表示的 train.avro
的架构是一个 JSON 格式的文件。查看train.avsc
:
准备数据集
使用 Avro 数据集 API 将 train.avro
加载为 TensorFlow 数据集:
上面的示例将 train.avro
转换为 TensorFlow 数据集。数据集的每个元素都是一个字典,其关键字为特征名称,值为转换后的稀疏或密集张量。例如,它会将 features
、label
、dataType
字段分别转换为 VarLenFeature(SparseTensor)、FixedLenFeature(DenseTensor) 和 FixLenFeature(DenseTensor)。由于 batch_size 为 3,它会将 train.avro
中的 3 条记录强制转换为结果数据集中的一个元素。对于 train.avro
中标签为 null 的第一条记录,Avro 读取器会将其替换为指定的默认值 (-100)。在本例中,train.avro
中总共有 4 条记录。由于批次大小为 3,结果数据集包含 3 个元素,最后一个元素的批次大小为 1。但是,如果大小小于批次大小,用户也可以通过启用 drop_final_batch
丢弃最后一个批次。例如:
此外,还可以增加 num_parallel_reads 以通过提高 Avro 解析/读取并行性来加速 Avro 数据处理。
有关 make_avro_record_dataset
的详细用法,请参阅 API 文档。
使用 Avro 数据集训练 tf.keras 模型
现在,我们来看一个端到端示例,该示例基于 MNIST 数据集使用 Avro 数据集来训练 tf.keras 模型。
使用 Avro 数据集 API 将 train.avro
加载为 TensorFlow 数据集:
定义一个简单的 Keras 模型:
使用 Avro 数据集训练 Keras 模型:
Avro 数据集可以解析任何 Avro 数据并将其强制转换为 TensorFlow 张量,包括记录、映射、数组、分支和枚举中的记录。解析信息作为映射传递到 Avro 数据集实现中,其中关键字用于编码如何解析数据,值用于编码如何将数据强制转换为 TensorFlow 张量 – 决定基元类型(例如 bool、int、long、float、double、string)以及张量类型(例如稀疏或密集)。下面提供了 TensorFlow 解析器类型(见表 1)和基元类型强制转换(表 2)的清单。
表 1 支持的 TensorFlow 解析器类型:
TensorFlow 解析器类型 | TensorFlow 张量 | 解释 |
---|---|---|
tf.FixedLenFeature([], tf.int32) | 密集张量 | 解析固定长度的特征;也就是说,所有行都具有相同的恒定数量元素,例如,只有一个元素或每行始终具有相同数量元素的数组 |
tf.SparseFeature(index_key=['key_1st_index', 'key_2nd_index'], value_key='key_value', dtype=tf.int64, size=[20, 50]) | 稀疏张量 | 解析稀疏特征,其中每行都有一个可变长度的索引和值清单。'index_key' 标识索引。'value_key' 标识值。'dtype' 为数据类型。'size' 为每个索引条目的预期最大索引值 |
tfio.experimental.columnar.VarLenFeatureWithRank([],tf.int64) | 稀疏张量 | 解析可变长度特征;这意味着每个数据行可以具有可变数量的元素,例如,第一行有 5 个元素,第二行有 7 个元素 |
表 2 支持的 Avro 类型到 TensorFlow 类型的转换:
Avro 基元类型 | TensorFlow 基元类型 |
---|---|
bool:二进制值 | tf.bool |
byte:8 位无符号字节序列 | tf.string |
double:双精度 64 位 IEEE 浮点数 | tf.float64 |
enum:枚举类型 | 使用符号名称的 tf.string |
float:单精度 32 位 IEEE 浮点数 | tf.float32 |
int:32 位有符号整数 | tf.int32 |
long:64 位有符号整数 | tf.int64 |
null:没有值 | 使用默认值 |
string:unicode 字符序列 | tf.string |
测试中提供了一组全面的 Avro 数据集 API 示例。