使用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 命令行非阻塞输入的小例子
Sep 27 Python
python中mechanize库的简单使用示例
Jan 10 Python
python optparse模块使用实例
Apr 09 Python
Python的Django框架使用入门指引
Apr 15 Python
python实现unicode转中文及转换默认编码的方法
Apr 29 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
python进程和线程用法知识点总结
May 28 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
Django框架请求生命周期实现原理
Nov 13 Python
Python读取ini配置文件传参的简单示例
Jan 05 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 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通过COM类调用组件的实现代码
2012/01/11 PHP
介绍一些PHP判断变量的函数
2012/04/24 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
浅析Python四种数据类型
2018/09/26 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
外贸销售员求职的自我评价
2013/11/23 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
2014财务年度工作总结
2014/11/11 职场文书
世界遗产导游词
2015/02/13 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
横空出世观后感
2015/06/09 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
spring boot实现文件上传
2022/08/14 Java/Android