使用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之父谈Python的未来形式
Jul 01 Python
Python定时器实例代码
Nov 01 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
如何在python中实现随机选择
Nov 02 Python
python isinstance函数用法详解
Feb 13 Python
Python3 assert断言实现原理解析
Mar 02 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
pandas DataFrame运算的实现
Jun 14 Python
Python 发送邮件方法总结
Aug 10 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 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与php MySQL 之间的关系
2009/07/17 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
开始着手第一个Django项目
2015/07/15 Python
Python实现求数列和的方法示例
2018/01/12 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Django工程的分层结构详解
2019/07/18 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
幼儿园教师国培感言
2014/02/02 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
公证委托书模板
2014/04/03 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
食品安全主题班会
2015/08/13 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL