使用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基础教程之循环介绍
Aug 29 Python
python对字典进行排序实例
Sep 25 Python
python判断给定的字符串是否是有效日期的方法
May 13 Python
Python判断字符串与大小写转换
Jun 08 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
python多个模块py文件的数据共享实例
Jan 11 Python
python读写csv文件方法详细总结
Jul 05 Python
python加载自定义词典实例
Dec 06 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 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登录环节防止sql注入的方法浅析
2014/06/30 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
PHP查询分页的实现代码
2017/06/09 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
JS实现复制功能
2017/03/01 Javascript
微信小程序实现卡片层叠滑动效果
2019/06/21 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
tensorflow识别自己手写数字
2018/03/14 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
python 下载文件的几种方法汇总
2021/01/06 Python
某公司.Net方向面试题
2014/04/24 面试题
工作中个人的自我评价
2013/12/31 职场文书
简历里的自我评价范文
2014/02/24 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
反四风对照检查材料
2014/09/22 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
新学期主题班会
2015/08/17 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python