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实现身份证号码解析
Sep 01 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
利用Python获取操作系统信息实例
Sep 02 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
Python实现的建造者模式示例
Aug 06 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 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下过滤HTML代码的函数
2007/12/10 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
js的逻辑运算符 ||
2010/05/31 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
jQuery基础知识小结
2014/12/22 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
python打开文件的方式有哪些
2020/06/29 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
CSS3 input框的实现代码类似Google登录的动画效果
2020/08/04 HTML / CSS
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
大学生个人简历中的自我评价
2013/12/27 职场文书
劳动之星获奖感言
2014/02/01 职场文书
《夸父追日》教学反思
2014/02/26 职场文书
开学典礼决心书
2014/03/11 职场文书
5s标语大全
2014/06/23 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
社区务虚会发言材料
2014/10/20 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
专职安全员岗位职责
2015/04/11 职场文书
安全生产学习心得体会
2016/01/18 职场文书
检讨书怎么写?
2019/06/21 职场文书