使用TFRecord存取多个数据案例


Posted in Python onFebruary 17, 2020

TensorFlow提供了一种统一的格式来存储数据,就是TFRecord,它可以统一不同的原始数据格式,并且更加有效地管理不同的属性。

TFRecord格式

TFRecord文件中的数据都是用tf.train.Example Protocol Buffer的格式来存储的,tf.train.Example可以被定义为:

message Example{
  Features features = 1
}

message Features{
  map<string, Feature> feature = 1
}

message Feature{
  oneof kind{
    BytesList bytes_list = 1
    FloatList float_list = 1
    Int64List int64_list = 1
  }
}

可以看出Example是一个嵌套的数据结构,其中属性名称可以为一个字符串,其取值可以是字符串BytesList、实数列表FloatList或整数列表Int64List。

将数据转化为TFRecord格式

以下代码是将MNIST输入数据转化为TFRecord格式:

# -*- coding: utf-8 -*-

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np


# 生成整数型的属性
def _int64_feature(value):
  return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))

# 生成浮点型的属性
def _float_feature(value):
  return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))  
#若想保存为数组,则要改成value=value即可


# 生成字符串型的属性
def _bytes_feature(value):
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))


mnist = input_data.read_data_sets("/tensorflow_google", dtype=tf.uint8, one_hot=True)
images = mnist.train.images
# 训练数据所对应的正确答案,可以作为一个属性保存在TFRecord中
labels = mnist.train.labels
# 训练数据的图像分辨率,这可以作为Example中的一个属性
pixels = images.shape[1]
num_examples = mnist.train.num_examples

# 输出TFRecord文件的地址
filename = "/tensorflow_google/mnist_output.tfrecords"
# 创建一个writer来写TFRecord文件
writer = tf.python_io.TFRecordWriter(filename)
for index in range(num_examples):
  # 将图像矩阵转换成一个字符串
  image_raw = images[index].tostring()
  # 将一个样例转化为Example Protocol Buffer, 并将所有的信息写入这个数据结构
  example = tf.train.Example(features=tf.train.Features(feature={
    'pixels': _int64_feature(pixels),
    'label': _int64_feature(np.argmax(labels[index])),
    'image_raw': _bytes_feature(image_raw)}))

  # 将一个Example写入TFRecord文件
  writer.write(example.SerializeToString())
writer.close()

本程序将MNIST数据集中所有的训练数据存储到了一个TFRecord文件中,若数据量较大,也可以存入多个文件。

从TFRecord文件中读取数据

以下代码可以从上面代码中的TFRecord中读取单个或多个训练数据:

# -*- coding: utf-8 -*-
import tensorflow as tf

# 创建一个reader来读取TFRecord文件中的样例
reader = tf.TFRecordReader()
# 创建一个队列来维护输入文件列表
filename_queue = tf.train.string_input_producer(["/Users/gaoyue/文档/Program/tensorflow_google/chapter7"
                         "/mnist_output.tfrecords"])

# 从文件中读出一个样例,也可以使用read_up_to函数一次性读取多个样例
# _, serialized_example = reader.read(filename_queue)
_, serialized_example = reader.read_up_to(filename_queue, 6) #读取6个样例
# 解析读入的一个样例,如果需要解析多个样例,可以用parse_example函数
# features = tf.parse_single_example(serialized_example, features={
# 解析多个样例
features = tf.parse_example(serialized_example, features={
  # TensorFlow提供两种不同的属性解析方法
  # 第一种是tf.FixedLenFeature,得到的解析结果为Tensor
  # 第二种是tf.VarLenFeature,得到的解析结果为SparseTensor,用于处理稀疏数据
  # 解析数据的格式需要与写入数据的格式一致
  'image_raw': tf.FixedLenFeature([], tf.string),
  'pixels': tf.FixedLenFeature([], tf.int64),
  'label': tf.FixedLenFeature([], tf.int64),
})

# tf.decode_raw可以将字符串解析成图像对应的像素数组
images = tf.decode_raw(features['image_raw'], tf.uint8)
labels = tf.cast(features['label'], tf.int32)
pixels = tf.cast(features['pixels'], tf.int32)

sess = tf.Session()
# 启动多线程处理输入数据
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

# 每次运行可以读取TFRecord中的一个样例,当所有样例都读完之后,会重头读取
# for i in range(10):
#   image, label, pixel = sess.run([images, labels, pixels])
#   # print(image, label, pixel)
#   print(label, pixel)

# 读取TFRecord中的前6个样例,若加入循环,则会每次从上次输出的地方继续顺序读6个样例
image, label, pixel = sess.run([images, labels, pixels])
print(label, pixel)

sess.close()

>> [7 3 4 6 1 8] [784 784 784 784 784 784]

输出结果显示,从TFRecord文件中顺序读出前6个样例。

以上这篇使用TFRecord存取多个数据案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python写的一个简单监控系统
Jun 19 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
Python中偏函数用法示例
Jun 07 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
Django中Middleware中的函数详解
Jul 18 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 #Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 #Python
python3连接MySQL8.0的两种方式
Feb 17 #Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 #Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 #Python
tensorflow生成多个tfrecord文件实例
Feb 17 #Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 #Python
You might like
php 移除数组重复元素的一点说明
2008/11/27 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
PHP微信分享开发详解
2017/01/14 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
jQuery拖拽div实现思路
2014/02/19 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
javascript实现留言板功能
2020/02/08 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
Python random模块常用方法
2014/11/03 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
.NET现在共支持多少种语言
2014/02/26 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
数学系毕业生求职信
2014/05/29 职场文书
宣传口号大全
2014/06/16 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
Python机器学习之底层实现KNN
2021/06/20 Python