Tensorflow使用tfrecord输入数据格式


Posted in Python onJune 19, 2018

Tensorflow 提供了一种统一的格式来存储数据,这个格式就是TFRecord,上一篇文章中所提到的方法当数据的来源更复杂,每个样例中的信息更丰富的时候就很难有效的记录输入数据中的信息了,于是Tensorflow提供了TFRecord来统一存储数据,接下来我们就来介绍如何使用TFRecord来同意输入数据的格式。

1. TFRecord格式介绍

TFRecord文件中的数据是通过tf.train.Example Protocol Buffer的格式存储的,下面是tf.train.Example的定义

message Example {
 Features features = 1;
};

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

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

从上述代码可以看到,ft.train.Example 的数据结构相对简洁。tf.train.Example中包含了一个从属性名称到取值的字典,其中属性名称为一个字符串,属性的取值可以为字符串(BytesList ),实数列表(FloatList )或整数列表(Int64List )。例如我们可以将解码前的图片作为字符串,图像对应的类别标号作为整数列表。

2. 将自己的数据转化为TFRecord格式

准备数据

在上一篇中,我们为了像伟大的MNIST致敬,所以选择图像的前缀来进行不同类别的分类依据,但是大多数的情况下,在进行分类任务的过程中,不同的类别都会放在不同的文件夹下,而且类别的个数往往浮动性又很大,所以针对这样的情况,我们现在利用不同类别在不同文件夹中的图像来生成TFRecord.

我们在Iris&Contact这个文件夹下有两个文件夹,分别为iris,contact。对于每个文件夹中存放的是对应的图片

转换数据

数据准备好以后,就开始准备生成TFRecord,具体代码如下:

import os 
import tensorflow as tf 
from PIL import Image 
import matplotlib.pyplot as plt 

cwd='/home/ruyiwei/Documents/Iris&Contact/'
classes={'iris','contact'} 
writer= tf.python_io.TFRecordWriter("iris_contact.tfrecords") 

for index,name in enumerate(classes):
  class_path=cwd+name+'/'
  for img_name in os.listdir(class_path): 
    img_path=class_path+img_name 
    img=Image.open(img_path)
    img= img.resize((512,80))
    img_raw=img.tobytes()
    #plt.imshow(img) # if you want to check you image,please delete '#'
    #plt.show()
    example = tf.train.Example(features=tf.train.Features(feature={
      "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
      'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))
    })) 
    writer.write(example.SerializeToString()) 

writer.close()

3. Tensorflow从TFRecord中读取数据

def read_and_decode(filename): # read iris_contact.tfrecords
  filename_queue = tf.train.string_input_producer([filename])# create a queue

  reader = tf.TFRecordReader()
  _, serialized_example = reader.read(filename_queue)#return file_name and file
  features = tf.parse_single_example(serialized_example,
                    features={
                      'label': tf.FixedLenFeature([], tf.int64),
                      'img_raw' : tf.FixedLenFeature([], tf.string),
                    })#return image and label

  img = tf.decode_raw(features['img_raw'], tf.uint8)
  img = tf.reshape(img, [512, 80, 3]) #reshape image to 512*80*3
  img = tf.cast(img, tf.float32) * (1. / 255) - 0.5 #throw img tensor
  label = tf.cast(features['label'], tf.int32) #throw label tensor
  return img, label

4. 将TFRecord中的数据保存为图片

filename_queue = tf.train.string_input_producer(["iris_contact.tfrecords"]) 
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)  #return file and file_name
features = tf.parse_single_example(serialized_example,
                  features={
                    'label': tf.FixedLenFeature([], tf.int64),
                    'img_raw' : tf.FixedLenFeature([], tf.string),
                  }) 
image = tf.decode_raw(features['img_raw'], tf.uint8)
image = tf.reshape(image, [512, 80, 3])
label = tf.cast(features['label'], tf.int32)
with tf.Session() as sess: 
  init_op = tf.initialize_all_variables()
  sess.run(init_op)
  coord=tf.train.Coordinator()
  threads= tf.train.start_queue_runners(coord=coord)
  for i in range(20):
    example, l = sess.run([image,label])#take out image and label
    img=Image.fromarray(example, 'RGB')
    img.save(cwd+str(i)+'_''Label_'+str(l)+'.jpg')#save image
    print(example, l)
  coord.request_stop()
  coord.join(threads)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python记录程序运行时间的三种方法
Jul 14 Python
用python实现的线程池实例代码
Jan 06 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
Python3模拟登录操作实例分析
Mar 12 Python
python实现字符串加密 生成唯一固定长度字符串
Mar 22 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
python性能测量工具cProfile使用解析
Sep 26 Python
python线程定时器Timer实现原理解析
Nov 30 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
如何用python 操作zookeeper
Dec 28 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 #Python
python如何爬取个性签名
Jun 19 #Python
详解TensorFlow查看ckpt中变量的几种方法
Jun 19 #Python
TensorFlow 滑动平均的示例代码
Jun 19 #Python
python3个性签名设计实现代码
Jun 19 #Python
TensorFlow 模型载入方法汇总(小结)
Jun 19 #Python
python3爬虫之设计签名小程序
Jun 19 #Python
You might like
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
php实现的MySQL通用查询程序
2007/03/11 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
vue接口请求加密实例
2020/08/11 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
Python利用Django如何写restful api接口详解
2018/06/08 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python爬虫 正则表达式解析
2019/09/28 Python
详解python中*号的用法
2019/10/21 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
银行领导证婚词
2014/01/11 职场文书
森林防火工作方案
2014/02/14 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
贷款担保书范本
2015/09/22 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫