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使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python扫描IP段查看指定端口是否开放的方法
Jun 09 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
Jan 15 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
python中hasattr()、getattr()、setattr()函数的使用
Aug 16 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
Django执行源生mysql语句实现过程解析
Nov 12 Python
python selenium 获取接口数据的实现
Dec 07 Python
Python实现仓库管理系统
May 30 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下检测字符串是否是utf8编码的代码
2008/06/28 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
JavaScript字符串对象
2017/01/14 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python字符串过滤性能比较5种方法
2017/06/22 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
美国高街时尚品牌:OASAP
2016/07/24 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
国外软件测试工程师面试题
2016/12/09 面试题
数控专业应届生求职信
2013/11/27 职场文书
七年级音乐教学反思
2014/01/26 职场文书
车间安全生产标语
2014/06/06 职场文书
教师求职自荐书
2014/06/14 职场文书
双拥工作宣传标语
2014/06/26 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
利用Pycharm连接服务器的全过程记录
2021/07/01 Python