TFRecord文件查看包含的所有Features代码


Posted in Python onFebruary 17, 2020

TFRecord作为tensorflow中广泛使用的数据格式,它跨平台,省空间,效率高。因为 Tensorflow开发者众多,统一训练时数据的文件格式是一件很有意义的事情,也有助于降低学习成本和迁移成本。

但是TFRecord数据是二进制格式,没法直接查看。因此,如何能够方便的查看TFRecord格式和数据,就显得尤为重要了。

为什么需要查看TFReocrd数据?首先我们先看下常规的写入和读取TFRecord数据的关键过程。

# 1. 写入过程
# 一张图片,我写入了其内容,label,长和宽几个信息
tf_example = tf.train.Example(
    features=tf.train.Features(feature={
      'encoded': bytes_feature(encoded_jpg),
      'label': int64_feature(label),
      'height': int64_feature(height),
      'width': int64_feature(width)}))
# 2. 读取过程
# 定义解析的TFRecord数据格式
def _parse_image(example_proto):
   features = {'encoded':tf.FixedLenFeature((),tf.string),
  'label': tf.FixedLenFeature((), tf.int64),
  'height': tf.FixedLenFeature((), tf.int64),
  'width': tf.FixedLenFeature((), tf.int64)
}
return tf.parse_single_example(example_proto, features)
 
# TFRecord数据按照Feature解析出对应的真实数据
ds = ds.map(lambda x : _parse_image(x), num_parallel_calls=4)

上面是一个标准的TFRecord数据的写入和读取部分过程,大家应该发现了,读取TFRecord数据的时候,得知道TFRecord数据保存的属性名和类型,任何一项不匹配,都会导致无法获取数据。

如果数据的写入和读取都是自己一个人完成,那就没问题。但是如果写入和读取是跨团队合作时候,如果每次读取数据都得让对方给完整的属性名和属性类型,那效率就太低了。毕竟TFRecord数据已经包含了一切,自己动手丰衣足食。

那么怎么查看TFRecord数据呢?使用python tf.train.Example.FromString(serialized_example)方法,方法的入参是TFRecord包含的数据字符串。

然后,我直接将上诉查看的过程写成了一个py脚本,需要自取。

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sys
import tensorflow as tf
 
# 用法:python trackTFRecord.py True file1 file2 
# trackTFRecord.py 就是当前这个py文件
# True 表示是否输出具体的数据
# file1 file2 表示的是需要查看的TFRecord文件的绝对路径
# 输出说明:tf.float32对应TFRecord的FloatList,tf.int64对应Int64List,tf.string对应BytesList
def main():
  print('TFRecord文件个数为{0}个'.format(len(sys.argv)-2))
  for i in range(2, len(sys.argv)):
    filepath = sys.argv[i]
    with tf.Session() as sess:
      filenames = [filepath]
      # 加载TFRecord数据
      ds = tf.data.TFRecordDataset(filenames)
      ds = ds.batch(10)
      ds = ds.prefetch(buffer_size=tf.contrib.data.AUTOTUNE)
      iterator = ds.make_one_shot_iterator()
      # 为了加快速度,仅仅简单拿一组数据看下结构
      batch_data = iterator.get_next()
      res = sess.run(batch_data)
      serialized_example = res[0]
      example_proto = tf.train.Example.FromString(serialized_example)
      features = example_proto.features
      print('{0} 信息如下:'.format(filepath))
      for key in features.feature:
        feature = features.feature[key]
        ftype = None
        fvalue = None
        if len(feature.bytes_list.value) > 0:
          ftype = 'bytes_list'
          fvalue = feature.bytes_list.value
          
        if len(feature.float_list.value) > 0:
          ftype = 'float_list'
          fvalue = feature.float_list.value
          
        if len(feature.int64_list.value) > 0:
          ftype = 'int64_list'
          fvalue = feature.int64_list.value
        
        result = '{0} : {1}'.format(key, ftype)
        if 'True' == sys.argv[1]:
          result = '{0} : {1}'.format(result, fvalue)
        print(result) 
 
if __name__ == "__main__":
  main()

下面给大家实例演示,首先先随便找个图片,写入到TFRecord数据

import tensorflow as tf
 
filename = "/Users/zhanhaitao/Desktop/1.png"
# 使用tf.read_file读进图片数据
image = tf.read_file(filename)
# 主要是为了获取图片的宽高
image_jpeg = tf.image.decode_jpeg(image, channels=3, name="decode_jpeg_picture")
# reshape图片到原始大小2500x2000x3
image_jpeg = tf.reshape(image_jpeg, shape=(2500,2000,3))
# 获取图片shape数据
img_shape = image_jpeg.shape
width = img_shape[0]
height = img_shape[1]
# 将原图片tensor生成bytes对象, image将保存到tfrecord
sess = tf.Session()
image = sess.run(image)
sess.close()
# 定义TFRecords文件的保存路径及其文件名
path_none = "/Users/zhanhaitao/Desktop/a.tfrecord"
# 定义不同压缩选项的TFRecordWriter
writer_none = tf.python_io.TFRecordWriter(path_none, options=None)
# 将外层features生成特定格式的example
example_none = tf.train.Example(features=tf.train.Features(feature={
"float_val":tf.train.Feature(float_list=tf.train.FloatList(value=[9.99])),
"width":tf.train.Feature(int64_list=tf.train.Int64List(value=[width])),
"height":tf.train.Feature(int64_list=tf.train.Int64List(value=[height])),
"image_raw":tf.train.Feature(bytes_list=tf.train.BytesList(value=[image]))
}))
# example系列化字符串
example_str_none = example_none.SerializeToString()
# 将系列化字符串写入协议缓冲区
writer_none.write(example_str_none)
 
# 关闭TFRecords文件操作接口
writer_none.close()
 
print("finish to write data to tfrecord file!")

然后,使用上面的脚本看下这个TFRecord数据定义了哪些属性,以及对应的格式,先进入到脚本的目录下,因为图像数据内容太大,影响阅读,就只看属性名和type了:

python trackTFRecord.py False /Users/zhanhaitao/Desktop/a.tfrecord
# 结果,其中bytes_list对应tf.string,int64_list对应tf.int64 float_list对应tf.float32
# image_raw : bytes_list
# width : int64_list
# float_val : float_list
# height : int64_list

以上这篇TFRecord文件查看包含的所有Features代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
Python中几种导入模块的方式总结
Apr 27 Python
浅谈python中列表、字符串、字典的常用操作
Sep 19 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
python实现月食效果实例代码
Jun 18 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
对python中UDP,socket的使用详解
Aug 22 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
pytorch之添加BN的实现
Jan 06 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 #Python
Python读取表格类型文件代码实例
Feb 17 #Python
基于Python获取docx/doc文件内容代码解析
Feb 17 #Python
Python多线程获取返回值代码实例
Feb 17 #Python
Python实现ATM系统
Feb 17 #Python
python设置环境变量的作用整理
Feb 17 #Python
python数据爬下来保存的位置
Feb 17 #Python
You might like
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
另一个javascript小测验(代码集合)
2011/07/27 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
使用python统计文件行数示例分享
2014/02/21 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
环境科学专业个人求职的自我评价
2013/11/28 职场文书
小学安全教育材料
2014/02/17 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
个人安全生产责任书
2014/07/28 职场文书
法定代表人证明书
2014/11/28 职场文书
职工培训工作总结
2015/08/10 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
初三英语教学反思
2016/02/15 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技
Apache自带的ab压力测试工具的实现
2022/07/23 Servers