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去掉字符串中空格的方法
Mar 11 Python
Python中编写ORM框架的入门指引
Apr 29 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
Python读写docx文件的方法
May 08 Python
python 匹配url中是否存在IP地址的方法
Jun 04 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
python networkx 根据图的权重画图实现
Jul 10 Python
django 类视图的使用方法详解
Jul 24 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
Python pip安装第三方库实现过程解析
Jul 09 Python
python 简单的调用有道翻译
Nov 25 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 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
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
numpy返回array中元素的index方法
2018/06/27 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
结构和类有什么异同
2012/07/16 面试题
大学生农村教师实习自我鉴定
2013/09/21 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
继承公证书样本
2014/04/04 职场文书
个人委托书范本
2014/09/13 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
新教师个人工作总结
2015/02/06 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
八年级作文之友情
2019/11/25 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
深入理解 Golang 的字符串
2022/05/04 Golang