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 相关文章推荐
wxpython 学习笔记 第一天
Feb 09 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
Python 字典与字符串的互转实例
Jan 13 Python
python Socket之客户端和服务端握手详解
Sep 18 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
PyQT实现多窗口切换
Apr 20 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
python中子类与父类的关系基础知识点
Feb 02 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 $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
php 操作调试的方法
2012/07/12 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
TensorFlow神经网络优化策略学习
2018/03/09 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
python实现堆排序的实例讲解
2020/02/21 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
网上签名寄语活动留言
2014/01/18 职场文书
校运会广播稿100字
2014/01/27 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
优秀护士演讲稿
2014/04/30 职场文书
师范毕业生求职信
2014/07/11 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
《小小的船》教学反思
2016/02/18 职场文书
八年级作文之友谊
2019/12/02 职场文书