什么是TensorFlow Records (Tfrecord)?该怎么使用?

本文详细介绍了TensorFlow Records(Tfrecord)的用途、优点和工作原理,包括如何利用tf.train.Example和tf.train.SequenceExample结构化数据,并提供编写和读取TFRecord文件的示例。
摘要由CSDN通过智能技术生成

前言

可以直接跳到下面完整的示例,前面是外文博客的翻译,可能读起来有点奇怪。

一段奇怪的翻译

Tensorflow一个不太为人所知的组件是TFRecord文件格式,这是Tensorflow自己的二进制存储格式。

如果您正在处理大型数据集,使用二进制文件格式存储数据会对导入管道的性能产生积极的影响,从而减少模型的训练时间。二进制数据在磁盘上占用的空间更少,复制所需的时间更少,而且可以更有效地从磁盘读取数据。
如果你的数据存储在磁盘上,二进制会让你获得更好的读写性能。

然而,纯粹的性能并不是TFRecord文件格式的唯一优点。它经过优化,可以以多种方式与Tensorflow一起使用。首先,它使组合多个数据集变得容易,并与库提供的数据导入和预处理功能无缝集成。特别是对于那些太大而不能完全存储在内存中的数据集,这是一个优势,因为只有在从磁盘加载(例如,一批)时需要的数据,然后处理。TFRecords的另一个主要优点是可以存储序列数据——例如,时间序列或字编码——以一种非常高效的方式,并且(从编码的角度)方便地导入这类数据。

所以,使用TFRecords有很多优点。但是有光的地方就必须有阴影,对于TFRecords来说,缺点是必须首先将数据转换成这种格式,而关于如何转换的文档非常有限。有一个官方教程和一些关于编写TFRecords的文章,但是我发现它们只是帮助我解决了一部分挑战。

在这篇文章中,我将解释构造和编写TFRecord文件所需的组件,并详细说明如何编写不同类型的数据。这将帮助你开始处理自己的挑战。

结构化的TFRecords

TFRecord文件将数据存储为二进制字符串序列。这意味着在将数据写入文件之前需要指定数据的结构。Tensorflow为此提供了两个组件:tf.train。和tf.train.SequenceExample示例。您必须将每个数据样本存储在这些结构中的一个中,然后序列化它并使用tf.python_io.TFRecordWriter写它到磁盘。
tf.train.Example是个协议缓冲区。协议缓冲区是谷歌开发的一种高效序列化结构化数据的方法。

我们可以使用以下两个api构建Tfrecords

tf.train.Example
tf.train.SequenceExample

什么时候使用tf.train.Example,什么时候使用tf.train.SequenceExample。
数据集中的每个特征都拥有相同的类型的时候使用tf.train.Example,这样说,你可能不是很明白。下面会有对应的例子。
让我们用电影推荐的数据举个例子吧。

我们有许多特征,每个特征都是一个列表,其中每个条目都具有相同的数据类型。为了将这些特征存储在TFRecord中,我们首先需要创建构成这些特征的列表。

tf.train.BytesList, tf.train.FloatList, and tf.train.Int64List这个三个函数就是为了处理不同类型的特征。具体可以参考,https://blog.csdn.net/Ding_xiaofei/article/details/102904638

movie_name_list = tf.train.BytesList(value=[b'The Shawshank Redemption', b'Fight Club'])
movie_rating_list = tf.train.FloatList(value=[9.0, 9.7])

python的字符串类型需要先转换成byte类型(e.g. my_string.encode(‘utf-8’)),然后才能传入tf.train.BytesList

tf.train.Feature将数据包装成tensorflow能够识别的类型,它接受bytes_list/float_list/int64_list类型

movie_names = tf.train.Feature(bytes_list=movie_name_list)
movie_ratings = tf.train.Feature(float_list=movie_rating_list)

tf.train.Features是tf.train.Feature的集合

movie_dict = {
'Movie Names': movie_names,
'Movie Ratings': movie_ratings
}
movies = tf.train.Features(feature=movie_dict)

tf.train.Example接受这些特征,

example = tf.train.Example(features=movies)

使用协议序列化结构化数据,写入文件

# "example" is of type tf.train.Example.
with tf.python_io.TFRecordWriter('movie_ratings.tfrecord') as writer:
writer.write(example.SerializeToString())

一个简单的tfrecord就完成了。

一个完整的tf.train.Features示例

import tensorflow as tf

##这里我们构建的数据,单个样本的各种特征有单值也有list类型
data = {
   
    'Age': 29,
    'Movie': ['The Shawshank Redemption', 'Fight Club'],
    'Movie Ratings': [9.0, 9.7],
    'Suggestion': 'Inception',
    'Suggestion Purchased': 1.0,
    'Purchase Price': 9.99
}

print(data)

##构建我们的协议,只能接受三种类型
##tf.train.Int64List   tf.train.BytesList tf.train.FloatList
##注意string类型要先转成byte类型
example = tf.train.Example(features=tf.train.Features(feature={
   
    'Age': tf.train.Feature(
        int64_list=tf.train.Int64List(value=[data['Age']])),
    'Movie': tf.train.Feature(
        bytes_list=tf.train.BytesList(
            value=[m.encode('utf-8') for m in data['Movie']])),
    'Movie Ratings': tf.train.Feature(
        float_list=tf.train.FloatList(value=data['Movie Ratings'])),
    'Suggestion': tf.train.Feature(
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值