关闭

[置顶] 云端TensorFlow读取数据IO的高效方式

标签: 机器学习深度学习Tensorflow
2535人阅读 评论(2) 收藏 举报
分类:

低效的IO方式

最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行TensorFlow的区别。本地读取数据是server端直接从client端获得graph进行计算,而云端服务server在获得graph之后还需要将计算下发到各个worker处理(具体原理可以参考视频教程-Tensorflow高级篇:https://tianchi.aliyun.com/competition/new_articleDetail.html)。

本文通过读取一个简单的CSV文件为例,帮助大家快速了解如何使用TensorFlow高效的读取数据。CSV文件如下:

1,1,1,1,1
2,2,2,2,2
3,3,3,3,3  

首先我们来看下大家容易产生问题的几个地方。

1.不建议用python本地读取文件的方式

PAI支持python的自带IO方式,但是需要将数据源和代码打包上传的方式使用,这种读取方式是将数据写入内存之后再计算,效率比较低,不建议使用。范例代码如下:

import csv
csv_reader=csv.reader(open('csvtest.csv'))
for row in csv_reader:
    print(row)  

2.尽量不要用第三方库的读取文件方法

很多同学使用第三方库的一些数据IO的方式进行数据读取,比如TFLearn、Panda的数据IO方式,这些方法很多都是通过封装PYTHON的读取方式实现的,所以在PAI平台使用的时候也会造成效率低下问题。

3.尽量不要用preload的方式读取文件

很多人在用PAI的服务的时候表示GPU并没有比本地的CPU速度快的明显,主要问题可能就出在数据IO这块。preload的方式是先把数据全部都读到内存中,然后再通过session计算,比如feed的读取方式。这样要先进行数据读取,再计算,不同步造成性能浪费,同时因为内存限制也无法支持大数据量的计算。举个例子:假设我们的硬盘中有一个图片数据集0001.jpg,0002.jpg,0003.jpg……我们只需要把它们读取到内存中,然后提供给GPU或是CPU进行计算就可以了。这听起来很容易,但事实远没有那么简单。事实上,我们必须要把数据先读入后才能进行计算,假设读入用时0.1s,计算用时0.9s,那么就意味着每过1s,GPU都会有0.1s无事可做,这就大大降低了运算的效率。

下面我们看下高效的读取方式。

高效的IO方式

高效的TensorFlow读取方式是将数据读取转换成OP,通过session run的方式拉去数据。另外,读取线程源源不断地将文件系统中的图片读入到一个内存的队列中,而负责计算的是另一个线程,计算需要数据时,直接从内存队列中取就可以了。这样就可以解决GPU因为IO而空闲的问题!

下面我们看下代码,如何在PAI平台通过OP的方式读取数据:

import argparse
import tensorflow as tf
import os
FLAGS=None
def main(_):
    dirname = os.path.join(FLAGS.buckets, "csvtest.csv")
    reader=tf.TextLineReader()
    filename_queue=tf.train.string_input_producer([dirname])
    key,value=reader.read(filename_queue)
    record_defaults=[[''],[''],[''],[''],['']]
    d1, d2, d3, d4, d5= tf.decode_csv(value, record_defaults, ',')

    init=tf.initialize_all_variables()

    with tf.Session() as sess:
        sess.run(init)
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess,coord=coord)
        for i in range(4):
            print(sess.run(d2))
        coord.request_stop()
        coord.join(threads)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--buckets', type=str, default='',
                        help='input data path')
    parser.add_argument('--checkpointDir', type=str, default='',
                        help='output model path')
    FLAGS, _ = parser.parse_known_args()
    tf.app.run(main=main)
  • dirname:OSS文件路径,可以是数组,方便下一阶段shuffle
  • reader:TF内置各种reader API,可以根据需求选用
  • tf.train.string_input_producer:将文件生成队列
  • tf.decode_csv:是一个splite功能的OP,可以拿到每一行的特定参数
  • 通过OP获取数据,在session中需要tf.train.Coordinator()和tf.train.start_queue_runners(sess=sess,coord=coord)

在代码中,我们的输入是3行5个字段:

1,1,1,1,1
2,2,2,2,2
3,3,3,3,3  

我们循环输出4次,打印出第2个字段。结果如图:

输出结果也证明了数据结构是成队列。

其它

1
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Tensor Flow shuffle_batch 的方式读csv文件的例子

tensor flow shuffle_batch
  • xljiulong
  • xljiulong
  • 2016-05-12 17:15
  • 7032

TensorFlow 读取CSV数据代码实现

TensorFlow 读取CSV数据原理在此就不做详细介绍,直接通过代码实现: 方法一: 详细读取tf_read.csv 代码 #coding:utf-8 import tensorflow as tf filename_queue = tf.train.string_input_pr...
  • lyc_yongcai
  • lyc_yongcai
  • 2017-06-19 23:10
  • 1007

tensorflow读取数据之CSV格式

tensorflow要想用起来,首先自己得搞定数据输入。官方文档中介绍了几种,1.一次性从内存中读取数据到矩阵中,直接输入;2.从文件中边读边输入,而且已经给设计好了多线程读写模型;3.把网络或者内存中的数据转化为tensorflow的专用格式tfRecord,存文件后再读取。 其中,从文件中边...
  • sunquan_ok
  • sunquan_ok
  • 2016-07-06 13:56
  • 10430

Tensorflow-1: csv文件读写与分批训练

今天尝试了一下读写csv文件并使用tensorflow训练数据,很方便。 程序训练的一个单隐藏层的网络,程序中所用到的m3c_data_train.csv和m3c_data_test.csv文件都是由17列若干行的数据组成,17列包括输入12列、输出4列和用来打乱数据用的随机列。 # -*- cod...
  • u013573632
  • u013573632
  • 2017-04-29 22:28
  • 1835

Tensorflow直接读取CSV文件

Tensorflow直接读取CSV文件整理一下tensorflow读取csv文件的基本流程,主要是官方文档中的例子的记录。 tensorflow读取csv文件相对pandas要复杂一下,基本过程如下: 产生文件名列表,这里可以一次性用pipline读取一系列csv文件。 建立阅读器,读取原始数据。...
  • freedom098
  • freedom098
  • 2017-02-20 09:46
  • 1602

TensorFlow基础3:数据读取的三种方式

TensorFlow之数据读取的三种方式
  • chengshuhao1991
  • chengshuhao1991
  • 2017-11-27 14:47
  • 106

TensorFlow高效读取数据的方法

概述关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据。 从文件读取数据: 在TensorFlow图的起始, 让一个输入管线从文件中读取数据。 预加载数据: 在TensorFlow图中定义常量或...
  • u012759136
  • u012759136
  • 2016-08-17 19:20
  • 39053

Tensorflow 读取Txt和Csv格式数据

我的数据: 6.1101,17.592 5.5277,9.1302 8.5186,13.662 7.0032,11.854 5.8598,6.8233 8.3829,11.886 7.4764,4.3483若格式为txt,则先转为Csv格式:# coding=utf-8 import ...
  • qq_29381089
  • qq_29381089
  • 2017-12-17 22:51
  • 123

TensorFlow数据读取方法

转自:http://honggang.io/2016/08/19/tensorflow-data-reading/ 引言 Tensorflow的数据读取有三种方式: Preloaded data: 预加载数据Feeding: Python产生数据,再把数据喂给后端。...
  • u010329292
  • u010329292
  • 2017-03-30 11:02
  • 2716

Tensorflow从文件读取数据

作者:曾翔钰 &&石炜贤 @曾翔钰 @石炜贤 TensorFlow程序读取数据一共有3种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据。 从文件读取数据: 在TensorFlow图的起始, 让一个输入管线从文件中读取...
  • zengxyuyu
  • zengxyuyu
  • 2016-11-22 19:47
  • 20939
    我的微信公众号

    作者公众号:凡人机器学习

    凡人机器学习

    机器学习微信交流群
    为了方便大家学习与交流,凡人云近日已开通机器学习社群! 分享“凡人机器学习”公众号名片到40人以上的大群并截图给小助手,小助手就会拉你入群 在这里你可以得到: 1.各种学术讨论 2.最新的资料分享 3.不定期的征文以及联谊活动! 小助手微信号:meiwznn
    作者新书《机器学习实践应用》

    主要讲述算法和业务的结合,适合初学者

    机器学习实践应用

    京东地址

    个人资料
    • 访问:816421次
    • 积分:10970
    • 等级:
    • 排名:第1712名
    • 原创:232篇
    • 转载:40篇
    • 译文:0篇
    • 评论:459条
    博客专栏
    统计