【Tensorflow2】TFRecord数据读写
TFRecord格式是官方推荐使用的模型输入数据的存储格式。模型在训练和预测的过程中,TFRecord格式用于组织模型的输入数据部分。
我们使用TFRecord来存储训练数据。同时,也使用TFRecord的数据作为模型计算的输入。
TFRecord的存储方式,能够以较小的空间来实现数据携带。对于基于Tensorflow Serving这种网络传输输入数据的打分形式,较小的传输数据,对打分性能的提升是很有帮助的。
所以,使用TFRecord就对了!
样例数据
1 | valueA1,2.3,valueC3:valueC2:valueC8,3:4,valueE3:valueE8:valueE3:valueE9,4.5:1.2:2.1,valueG5:valueG9#valueG3:valueG1#valueG5:valueG3,4:5:2#1:2:3,3:20:5:3,1:0:2:2,4:2:8:9,valueI6:valueI9:valueI3:valueI6 |
逗号(,)分割了每个特征列。井号(#)分割了每个特征内的多个取值。冒号(:)分割了每个取值的每个元素。
这里定义特征列的名称为:
[“featureA”, “featureB”, “featureC”, “featureD”, “featureE”, “featureF”, “featureG”,
“featureH”, “featureI_Index0”, “featureI_Index1”, “featureI_Index2”, “featureI_value”]
Schema定义
1 | import tensorflow as tf |
tf.io.FixedLenFeature
用于解析shape和类型确定的特征列。在特征列缺失的情况下,default_value不设置会引发错误。default_value的值需要和设置的shape保持一致。
tf.io.VarLenFeature
用于解析类型确定,但是shape不确定的特征列。
tf.io.FixedLenSequenceFeature
用于解析shape和类型确定的序列特征列。这里的序列特征存储的数据像这样:[(1,2), (3,4), (5,6)]。列表的长度不固定,但是每个元素的shape固定。
allow_missing=True允许特征值不存在。通过default_value来指定填充的默认值。
tf.io.parse_sequence_example方法貌似要求default_value必须设置为None
tf.io.SparseFeature
用于解析通过稀疏矩阵的格式来存储的特征,包括index_key和value_key两部分。凡是用到SparseFeature的地方,都建议使用VarLenFeature来替代。
TFRecord数据读写(java/scala版)
使用tensorflow-utils组装TFRecord数据
1 | import org.tensorflow.example.Example; |
使用Spark快速读写TFRecord数据
1 | import org.apache.hadoop.io.{BytesWritable, NullWritable} |
TFRecord数据读写(python版)
TFRecord写入样例
1 | import tensorflow as tf |
TFRecord解析
使用tf.io.parse_single_sequence_example解析SequenceExample数据时,不支持tf.io.SparseFeature特征列,所以解析的时候把featureI剔除了。
1 | import tensorflow as tf |
上面的程序解析的结果如下:
1 | ======================example====================== |
Example解析API
- tf.io.parse_single_example(serialized, features)
- tf.io.parse_example(serialized, features)
- tf.io.parse_single_sequence_example(serialized, context_features=None, sequence_features=None)
- tf.io.parse_sequence_example(serialized, context_features=None, sequence_features=None)
single版解析单条数据,非single版需要加一个batch维度。其余方面两者用法完全一致。