TensorFlow高效读取数据的方法示例


Posted in Python onFebruary 06, 2018

概述

最新上传的mcnn中有完整的数据读写示例,可以参考。

关于Tensorflow读取数据,官网给出了三种方法:

  1. 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据。
  2. 从文件读取数据: 在TensorFlow图的起始, 让一个输入管线从文件中读取数据。
  3. 预加载数据: 在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。

对于数据量较小而言,可能一般选择直接将数据加载进内存,然后再分batch输入网络进行训练(tip:使用这种方法时,结合yield 使用更为简洁,大家自己尝试一下吧,我就不赘述了)。但是,如果数据量较大,这样的方法就不适用了,因为太耗内存,所以这时最好使用tensorflow提供的队列queue,也就是第二种方法 从文件读取数据。对于一些特定的读取,比如csv文件格式,官网有相关的描述,在这儿我介绍一种比较通用,高效的读取方法(官网介绍的少),即使用tensorflow内定标准格式——TFRecords

太长不看,直接看源码请猛戳我的github,记得加星哦。

TFRecords

TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是它能更好的利用内存,更方便复制和移动,并且不需要单独的标签文件(等会儿就知道为什么了)… …总而言之,这样的文件格式好处多多,所以让我们用起来吧。

TFRecords文件包含了tf.train.Example 协议内存块(protocol buffer)(协议内存块包含了字段 Features)。我们可以写一段代码获取你的数据, 将数据填入到Example协议内存块(protocol buffer),将协议内存块序列化为一个字符串, 并且通过tf.python_io.TFRecordWriter 写入到TFRecords文件。

从TFRecords文件中读取数据, 可以使用tf.TFRecordReader的tf.parse_single_example解析器。这个操作可以将Example协议内存块(protocol buffer)解析为张量。

接下来,让我们开始读取数据之旅吧~

生成TFRecords文件

我们使用tf.train.Example来定义我们要填入的数据格式,然后使用tf.python_io.TFRecordWriter来写入。

import os
import tensorflow as tf 
from PIL import Image

cwd = os.getcwd()

'''
此处我加载的数据目录如下:
0 -- img1.jpg
   img2.jpg
   img3.jpg
   ...
1 -- img1.jpg
   img2.jpg
   ...
2 -- ...
 这里的0, 1, 2...就是类别,也就是下文中的classes
 classes是我根据自己数据类型定义的一个列表,大家可以根据自己的数据情况灵活运用
...
'''
writer = tf.python_io.TFRecordWriter("train.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((224, 224))
    img_raw = img.tobytes()       #将图片转化为原生bytes
    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()

关于Example Feature的相关定义和详细内容,我推荐去官网查看相关API。

基本的,一个Example中包含Features,Features里包含Feature(这里没s)的字典。最后,Feature里包含有一个 FloatList, 或者ByteList,或者Int64List

就这样,我们把相关的信息都存到了一个文件中,所以前面才说不用单独的label文件。而且读取也很方便。

接下来是一个简单的读取小例子:

for serialized_example in tf.python_io.tf_record_iterator("train.tfrecords"):
  example = tf.train.Example()
  example.ParseFromString(serialized_example)

  image = example.features.feature['image'].bytes_list.value
  label = example.features.feature['label'].int64_list.value
  # 可以做一些预处理之类的
  print image, label

使用队列读取

一旦生成了TFRecords文件,为了高效地读取数据,TF中使用队列(queue)读取数据。

def read_and_decode(filename):
  #根据文件名生成一个队列
  filename_queue = tf.train.string_input_producer([filename])

  reader = tf.TFRecordReader()
  _, serialized_example = reader.read(filename_queue)  #返回文件名和文件
  features = tf.parse_single_example(serialized_example,
                    features={
                      'label': tf.FixedLenFeature([], tf.int64),
                      'img_raw' : tf.FixedLenFeature([], tf.string),
                    })

  img = tf.decode_raw(features['img_raw'], tf.uint8)
  img = tf.reshape(img, [224, 224, 3])
  img = tf.cast(img, tf.float32) * (1. / 255) - 0.5
  label = tf.cast(features['label'], tf.int32)

  return img, label

之后我们可以在训练的时候这样使用

img, label = read_and_decode("train.tfrecords")

#使用shuffle_batch可以随机打乱输入
img_batch, label_batch = tf.train.shuffle_batch([img, label],
                        batch_size=30, capacity=2000,
                        min_after_dequeue=1000)
init = tf.initialize_all_variables()

with tf.Session() as sess:
  sess.run(init)
  threads = tf.train.start_queue_runners(sess=sess)
  for i in range(3):
    val, l= sess.run([img_batch, label_batch])
    #我们也可以根据需要对val, l进行处理
    #l = to_categorical(l, 12) 
    print(val.shape, l)

至此,tensorflow高效从文件读取数据差不多完结了。

恩?等等…什么叫差不多?对了,还有几个注意事项:

第一,tensorflow里的graph能够记住状态(state),这使得TFRecordReader能够记住tfrecord的位置,并且始终能返回下一个。而这就要求我们在使用之前,必须初始化整个graph,这里我们使用了函数tf.initialize_all_variables()来进行初始化。

第二,tensorflow中的队列和普通的队列差不多,不过它里面的operation和tensor都是符号型的(symbolic),在调用sess.run()时才执行。

第三, TFRecordReader会一直弹出队列中文件的名字,直到队列为空。

总结

  1. 生成tfrecord文件
  2. 定义record reader解析tfrecord文件
  3. 构造一个批生成器(batcher)
  4. 构建其他的操作
  5. 初始化所有的操作
  6. 启动QueueRunner

例子代码请戳我的github,如果觉得对你有帮助的话可以加个星哦。

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

Python 相关文章推荐
python将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
使用go和python递归删除.ds store文件的方法
Jan 22 Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
python中字符串的操作方法大全
Jun 03 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
python儿童学游戏编程知识点总结
Jun 03 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
Python爬虫与反爬虫大战
Jul 30 Python
django使用xlwt导出excel文件实例代码
Feb 06 #Python
Python使用装饰器进行django开发实例代码
Feb 06 #Python
Python yield与实现方法代码分析
Feb 06 #Python
Django中间件工作流程及写法实例代码
Feb 06 #Python
Django数据库表反向生成实例解析
Feb 06 #Python
Python使用functools实现注解同步方法
Feb 06 #Python
django中send_mail功能实现详解
Feb 06 #Python
You might like
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
第七节 类的静态成员 [7]
2006/10/09 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
Angularjs自定义指令Directive详解
2017/05/27 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
优秀员工自荐信范文
2013/10/05 职场文书
高校十八大报告感想
2014/01/27 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
建议书的格式
2014/05/12 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
电话客服工作职责
2014/07/27 职场文书
管理工程专业求职信
2014/08/10 职场文书
银行授权委托书格式
2014/10/10 职场文书