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的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
Python模拟登陆实现代码
Jun 14 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
python二进制文件的转译详解
Jul 03 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 Python
Pytorch 如何实现常用正则化
May 27 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
一个php作的文本留言本的例子(四)
2006/10/09 PHP
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
php 静态变量的初始化
2009/11/15 PHP
PHP反射实际应用示例
2019/04/03 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
Vue运用transition实现过渡动画
2019/05/06 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
在Python中操作字典之clear()方法的使用
2015/05/21 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
Python 爬虫的原理
2020/07/30 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
后勤采购员岗位职责
2013/12/19 职场文书
乳制品整治工作方案
2014/05/29 职场文书
党员创先争优心得体会
2014/09/11 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js