界涌北门户网
日期归档
当前位置:主页>国内新闻>
TensorFlow中TFRecord文件的生成和读取方法
来源:szfuquan.com.cn  阅读量:907

TFRecord是TensorFlow的默认标准文件格式,它本质上是一个二进制文件,遵循协议缓冲区(PB)协议(协议缓冲区是谷歌的数据交换格式,独立于语言,独立于平台),其后缀一般用于tfrecord。 TFRecord文件易于复制和移动,可以充分利用内存,不需要单独标记文件,适合顺序读取大量数据。这是TensorFlow从文件中读取数据的官方推荐方法。

第一步是生成TFRecord Writer

Writer=tf.python_io.TFRecordWriter(path,options=None)

路径:TFRecord文件的路径;

选项:TFRecordOptions对象,定义TFRecord文件保存的压缩格式;

有三种文件压缩格式,TFRecordCompressionType.ZLIB,TFRecordCompressionType.GZIP和TFRecordCompressionType.NONE。默认值是最后一个,即不执行压缩。定义方法如下:

Option=tf.python_io.TFRecordOptions(tf.python_io.TFRecordCompressionType.ZLIB)

第二步,tf.train.Feature生成协议缓冲区格式

例子的协议缓冲格式的定义:

在Example对象内部有一个Features类型的成员。功能是地图列表。 feature=example.features.feature获取的特征是一个映射,键是字符串,值是Feature。

内部特征是字典值,其将类型列表(例如名称,形状等)编码为特定特征格式,并且字典键(Key)用于在读取TFRecord文件时读取不同数据。类型列表可以包含零个或多个值。列表类型通常具有BytesList,FloatList和Int64List。通常,以下方法用于生成列表类型,然后将其发送到tf.train.Feature代码的内层:

tf.train.BytesList(value=[value])#value转换为字符串(二进制)列表

tf.train.FloatList(value=[value])#value转换为浮点列表

tf.train.Int64List(value=[value])#value将转换为整数列表

其中value是要保存的数据。

外部特征再次编码内部字典:

Features_extern=tf.train.Features(feature_internal)

第三步是使用tf.train将特征编码数据封装成特定的PB协议格式。示例

示例=tf.train.Example(features_extern)

第四步是将示例数据序列化为字符串

Example_str=example.SerializeToString()

在第五步中,序列化为字符串的示例数据被写入协议缓冲区(PB)

Writer.write(example_str)

Writer.close()

Writer.close()关闭TFRecordWriter。将数据写入协议缓冲区后,通常需要调用writer.close()来主动关闭TFRecord文件操作界面。

完整的代码如下:

将tensorflow导入为tf

Def gen_tfrecord(输入,输出):

'''使用TFRecordWriter将信息写入TFRecord文件'''

Writer=tf.python_io.TFRecordWriter(输出)

#阅读图片和解码

Image=tf.read_file(输入)

Image=tf.image.decode_jpeg(image)

使用tf.Session()作为sess:

Image=sess.run(图片)

Shape=image.shape

#将图像转换为字符串。

Image_data=image.tostring()

打印(类型(图像))

打印(LEN(IMAGE_DATA))

Name=bytes('Liushishi',encoding='utf8')

打印(类型(名称))

#创建一个Example对象,并一对一地填充Feature。

示例=tf.train.Example(features=tf.train.Features(feature={

'name': tf.train.Feature(bytes_list=tf.train.BytesList(value=[name])),

'shape': tf.train.Feature(int64_list=tf.train.Int64List(value=[shape [0],shape [1],shape [2]])),

'data': tf.train.Feature(bytes_list=tf.train.BytesList(value=[image_data]))

}

))

#将示例序列化为字符串类型并写入。

Writer.write(example.SerializeToString())

Writer.close()

原始演示图片:

代码说明:

1.解码图像,将其转换为字符串数据,然后填入。

2. Feature的值是一个列表,所以记得添加[]。

3.示例需要在编写之前调用SerializetoString()进行序列化。

上述示例表示将图片信息写入TFRecord,图片信息包含图片名称(名称),图片尺寸信息和图片数据,分别对应名称,形状,数据等功能。

输出文件tfrecord可以通过调用上面的gen_tfrecord()函数获得。

Gen_tfrecord( './liushishi.jpg', '/数据/liushishi.tfrecord')

示例代码如下:

将numpy导入为np

将matplotlib.pyplot导入为plt

将tensorflow导入为tf

Def _parse_record(example_proto):

#将数据反序列化为结构化数据

功能={

'name': tf.FixedLenFeature((),tf.string),

'shape': tf.FixedLenFeature([3],tf.int64),

'data': tf.FixedLenFeature((),tf.string)}

Parsed_features=tf.parse_single_example(example_proto,features=features)

返回parsed_features

Def gen_display_tfrecord(input_file):

#dread tfrecord file with dataset

Dataset=tf.data.TFRecordDataset(input_file)

数据集=dataset.map(_parse_record)

迭代器=数据集。 make_one_shot_iterator()

随着tf。 Session()为sess:

特点=sess。 run(iterator.get_next())

Name=features ['name']

名称=姓名。 decode()

Img_data=features ['data']

Shape=features ['shape']

打印(类型(形状))

打印(len(img_data)

#从bytes数组加载原始图像数据并重新整形。结果是ndarray数组。

Img_data=np。 fromstring(img_data,dtype=np.intint8)

Image_data=np。重塑(img_data,shape)

PLT。图()

#显示图片

PLT。 imshow(image_data)

PLT。标题(姓名)

PLT。 show()

打印('完成')

代码说明:

使用数据集读取tfrecord文件;将数据反序列化为结构化数据。在解析示例时,使用现成的API函数tf.parse_single_example;使用np.fromstring()方法获取解析后的字符串数据,记住数据格式恢复为np.uint8;因为图像形状被写入示例中,所以在解析时必须指定维度,这里是[3],否则程序报告错误。

调用gen_display_tfrecord函数来验证输出。

Gen_display_tfrecord( './数据/liushishi.tfrecord')

参考链接:

详细解释了您可能无法规避的TFRecord文件格式

如何生成和读取tensorflow TFRecord文件

——

友情链接:
界涌北门户网 版权所有© www.szfuquan.com.cn 技术支持:界涌北门户网 | 网站地图