熱門文章
電 話:023-6276-4481
郵箱:
地址:重慶市南岸區亞太商谷6幢25-2
Tensorflow 數據讀取有三種方(fang)式:
Preloaded data: 預加載數據
Feeding: Python產生(sheng)數據,再把數據喂給后(hou)端。
Reading from file: 從文件中直接(jie)讀取(qu)
這三種有讀取方式有什么區別呢? 我們首(shou)先要知道(dao)TensorFlow(TF)是(shi)怎么樣工作的。
TF的(de)(de)核心是(shi)用C++寫的(de)(de),這樣的(de)(de)好(hao)處是(shi)運行(xing)快,缺點是(shi)調用不靈(ling)活(huo)。而(er)Python恰好(hao)相反(fan),所以結合兩種語(yu)言的(de)(de)優勢。涉(she)及計(ji)算的(de)(de)核心算子(zi)和運行(xing)框架是(shi)用C++寫的(de)(de),并提供(gong)API給Python。Python調用這些API,設(she)計(ji)訓練模型(xing)(Graph),再將設(she)計(ji)好(hao)的(de)(de)Graph給后端去執行(xing)。簡而(er)言之,Python的(de)(de)角色是(shi)Design,C++是(shi)Run。
一、預加載數據:
import tensorflow as tf
# 設計Graph
x1 = tf.constant([2, 3, 4])
x2 = tf.constant([4, 0, 1])
y = tf.add(x1, x2)
# 打開一個session --> 計算y
with tf.Session() as sess:
print sess.run(y)
二(er)、python產生數據,再(zai)將數據喂給后端
import tensorflow as tf
# 設(she)計(ji)Graph
x1 = tf.placeholder(tf.int16)
x2 = tf.placeholder(tf.int16)
y = tf.add(x1, x2)
# 用Python產生(sheng)數據
li1 = [2, 3, 4]
li2 = [4, 0, 1]
# 打開(kai)一個(ge)session --> 喂數(shu)據 --> 計算y
with tf.Session() as sess:
print sess.run(y, feed_dict={x1: li1, x2: li2})
說明:在這里x1, x2只是占位符,沒(mei)有(you)具體的(de)值,那么(me)運行的(de)時候去(qu)哪取(qu)值呢?這時候就要用到sess.run()
中(zhong)的feed_dict
參數,將Python產生的(de)數據喂給后端,并計算y。
這兩種方案的缺點:
1、預加載(zai):將數(shu)據直接內嵌到(dao)Graph中(zhong)(zhong),再把(ba)Graph傳(chuan)(chuan)入Session中(zhong)(zhong)運行。當數(shu)據量比較(jiao)大時,Graph的傳(chuan)(chuan)輸會遇到(dao)效率問題。
2、用占位符替代數(shu)據(ju),待運行的時候(hou)填充(chong)數(shu)據(ju)。
前兩種(zhong)方(fang)法很方(fang)便,但是(shi)遇到大(da)型(xing)數據的時候就會很吃力,即(ji)使是(shi)Feeding,中(zhong)間(jian)環節的增加也是(shi)不小的開銷,比如數據類(lei)型(xing)轉換等等。最優的方案就是在Graph定義好文件讀取的方法,讓TF自己去從文件中讀取數據,并解碼成可使用的樣本集。
三、從文件中讀(du)取(qu),簡單來說就是將數據讀(du)取(qu)模塊的圖搭好
1、準備數據,構造(zao)三個文件,A.csv,B.csv,C.csv
$ echo -e "Alpha1,A1\nAlpha2,A2\nAlpha3,A3" > A.csv
$ echo -e "Bee1,B1\nBee2,B2\nBee3,B3" > B.csv
$ echo -e "Sea1,C1\nSea2,C2\nSea3,C3" > C.csv
2、單(dan)個Reader,單(dan)個樣本
#-*- coding:utf-8 -*-
import tensorflow as tf
# 生(sheng)成(cheng)一(yi)個(ge)先入先出(chu)隊列(lie)和一(yi)個(ge)QueueRunner,生(sheng)成(cheng)文(wen)件名隊列(lie)
filenames = ['A.csv', 'B.csv', 'C.csv']
filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
# 定(ding)義Reader
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
# 定義Decoder
example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']])
#example_batch, label_batch = tf.train.shuffle_batch([example,label], batch_size=1, capacity=200, min_after_dequeue=100, num_threads=2)
# 運行Graph
with tf.Session() as sess:
coord = tf.train.Coordinator() #創建一個協調器(qi),管(guan)理(li)線(xian)程
threads = tf.train.start_queue_runners(coord=coord) #啟動QueueRunner, 此時文(wen)件名隊列已(yi)經(jing)進(jin)隊。
for i in range(10):
print example.; background-color: inherit;">&am