tensorflow載入資料的三種方式
Tensorflow資料讀取有三種方式:
- Preloaded data: 預載入資料
- Feeding: Python產生資料,再把資料餵給後端。
- Reading from file: 從檔案中直接讀取
這三種有讀取方式有什麼區別呢? 我們首先要知道TensorFlow(TF)是怎麼樣工作的。
TF的核心是用C++寫的,這樣的好處是執行快,缺點是呼叫不靈活。而Python恰好相反,所以結合兩種語言的優勢。涉及計算的核心運算元和執行框架是用C++寫的,並提供API給Python。Python呼叫這些API,設計訓練模型(Graph),再將設計好的Graph給後端去執行。簡而言之,Python的角色是Design,C++是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)
二、python產生資料,再將資料餵給後端
- import tensorflow as tf
- # 設計Graph
- x1 = tf.placeholder(tf.int16)
- x2 = tf.placeholder(tf.int16)
- y = tf.add(x1, x2)
- # 用Python產生資料
- li1 = [2, 3, 4]
- li2 = [4, 0, 1]
- # 開啟一個session --> 喂資料 --> 計算y
- with tf.Session() as sess:
- print sess.run(y, feed_dict={x1: li1, x2: li2})
sess.run()
中的feed_dict
引數,將Python產生的資料餵給後端,並計算y。這兩種方案的缺點:
1、預載入:將資料直接內嵌到Graph中,再把Graph傳入Session中執行。當資料量比較大時,Graph的傳輸會遇到效率問題。
2、用佔位符替代資料,待執行的時候填充資料。
前兩種方法很方便,但是遇到大型資料的時候就會很吃力,即使是Feeding,中間環節的增加也是不小的開銷,比如資料型別轉換等等。最優的方案就是在Graph定義好檔案讀取的方法,讓TF自己去從檔案中讀取資料,並解碼成可使用的樣本集。
三、從檔案中讀取,簡單來說就是將資料讀取模組的圖搭好
1、準備資料,構造三個檔案,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、單個Reader,單個樣本
- #-*- coding:utf-8 -*-
- import tensorflow as tf
- # 生成一個先入先出佇列和一個QueueRunner,生成檔名佇列
- filenames = ['A.csv', 'B.csv', 'C.csv']
- filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
- # 定義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() #建立一個協調器,管理執行緒
- threads = tf.train.start_queue_runners(coord=coord) #啟動QueueRunner, 此時檔名佇列已經進隊。
- for i in range(10):
- print example.eval(),label.eval()
- coord.request_stop()
- coord.join(threads)
Alpha1 A2
Alpha3 B1
Bee2 B3
Sea1 C2
Sea3 A1
Alpha2 A3
Bee1 B2
Bee3 C1
Sea2 C3
Alpha1 A2
解決方案:用tf.train.shuffle_batch,那麼生成的結果就能夠對應上。
- #-*- coding:utf-8 -*-
- import tensorflow as tf
- # 生成一個先入先出佇列和一個QueueRunner,生成檔名佇列
- filenames = ['A.csv', 'B.csv', 'C.csv']
- filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
- # 定義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() #建立一個協調器,管理執行緒
- threads = tf.train.start_queue_runners(coord=coord) #啟動QueueRunner, 此時檔名佇列已經進隊。
- for i in range(10):
- e_val,l_val = sess.run([example_batch, label_batch])
- print e_val,l_val
- coord.request_stop()
- coord.join(threads)
3、單個Reader,多個樣本,主要也是通過tf.train.shuffle_batch來實現
- #-*- coding:utf-8 -*-
- import tensorflow as tf
- filenames = ['A.csv', 'B.csv', 'C.csv']
- filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
- reader = tf.TextLineReader()
- key, value = reader.read(filename_queue)
- example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']])
- # 使用tf.train.batch()會多加了一個樣本佇列和一個QueueRunner。
- #Decoder解後資料會進入這個佇列,再批量出隊。
- # 雖然這裡只有一個Reader,但可以設定多執行緒,相應增加執行緒數會提高讀取速度,但並不是執行緒越多越好。
- example_batch, label_batch = tf.train.batch(
- [example, label], batch_size=5)
- with tf.Session() as sess:
- coord = tf.train.Coordinator()
- threads = tf.train.start_queue_runners(coord=coord)
- for i in range(10):
- e_val,l_val = sess.run([example_batch,label_batch])
- print e_val,l_val
- coord.request_stop()
- coord.join(threads)
說明:下面這種寫法,提取出來的batch_size個樣本,特徵和label之間也是不同步的
- #-*- coding:utf-8 -*-
- import tensorflow as tf
- filenames = ['A.csv', 'B.csv', 'C.csv']
- filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
- reader = tf.TextLineReader()
- key, value = reader.read(filename_queue)
- example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']])
- # 使用tf.train.batch()會多加了一個樣本佇列和一個QueueRunner。
- #Decoder解後資料會進入這個佇列,再批量出隊。
- # 雖然這裡只有一個Reader,但可以設定多執行緒,相應增加執行緒數會提高讀取速度,但並不是執行緒越多越好。
- example_batch, label_batch = tf.train.batch(
- [example, label], batch_size=5)
- with tf.Session() as sess:
- coord = tf.train.Coordinator()
- threads = tf.train.start_queue_runners(coord=coord)
- for i in range(10):
- print example_batch.eval(), label_batch.eval()
- coord.request_stop()
- coord.join(threads)
['Alpha1' 'Alpha2' 'Alpha3' 'Bee1' 'Bee2'] ['B3' 'C1' 'C2' 'C3' 'A1']
['Alpha2' 'Alpha3' 'Bee1' 'Bee2' 'Bee3'] ['C1' 'C2' 'C3' 'A1' 'A2']
['Alpha3' 'Bee1' 'Bee2' 'Bee3' 'Sea1'] ['C2' 'C3' 'A1' 'A2' 'A3']
4、多個reader,多個樣本
- #-*- coding:utf-8 -*-
- import tensorflow as tf
- filenames = ['A.csv', 'B.csv', 'C.csv']
- filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
- reader = tf.TextLineReader()
- key, value = reader.read(filename_queue)
- record_defaults = [['null'], ['null']]
- #定義了多種解碼器,每個解碼器跟一個reader相連
- example_list = [tf.decode_csv(value, record_defaults=record_defaults)
- for _ in range(2)] # Reader設定為2
- # 使用tf.train.batch_join(),可以使用多個reader,並行讀取資料。每個Reader使用一個執行緒。
- example_batch, label_batch = tf.train.batch_join(
- example_list, batch_size=5)
- with tf.Session() as sess:
- coord = tf.train.Coordinator()
- threads = tf.train.start_queue_runners(coord=coord)
- for i in range(10):
- e_val,l_val = sess.run([example_batch,label_batch])
- print e_val,l_val
- coord.request_stop()
- coord.join(threads)
tf.train.batch
與tf.train.shuffle_batch
函式是單個Reader讀取,但是可以多執行緒。tf.train.batch_join
與tf.train.shuffle_batch_join
可設定多Reader讀取,每個Reader使用一個執行緒。至於兩種方法的效率,單Reader時,2個執行緒就達到了速度的極限。多Reader時,2個Reader就達到了極限。所以並不是執行緒越多越快,甚至更多的執行緒反而會使效率下降。5、迭代控制,設定epoch引數,指定我們的樣本在訓練的時候只能被用多少輪
- #-*- coding:utf-8 -*-
- import tensorflow as tf
- filenames = ['A.csv', 'B.csv', 'C.csv']
- #num_epoch: 設定迭代數
- filename_queue = tf.train.string_input_producer(filenames, shuffle=False,num_epochs=3)
- reader = tf.TextLineReader()
- key, value = reader.read(filename_queue)
- record_defaults = [['null'], ['null']]
- #定義了多種解碼器,每個解碼器跟一個reader相連
- example_list = [tf.decode_csv(value, record_defaults=record_defaults)
- for _ in range(2)] # Reader設定為2
- # 使用tf.train.batch_join(),可以使用多個reader,並行讀取資料。每個Reader使用一個執行緒。
- example_batch, label_batch = tf.train.batch_join(
- example_list, batch_size=1)
- #初始化本地變數
- init_local_op = tf.initialize_local_variables()
- with tf.Session() as sess:
- sess.run(init_local_op)
- coord = tf.train.Coordinator()
- threads = tf.train.start_queue_runners(coord=coord)
- try:
- while not coord.should_stop():
- e_val,l_val = sess.run([example_batch,label_batch])
- print e_val,l_val
- except tf.errors.OutOfRangeError:
- print('Epochs Complete!')
- finally:
- coord.request_stop()
- coord.join(threads)
- coord.request_stop()
- coord.join(threads)
在迭代控制中,記得新增
tf.initialize_local_variables()
,官網教程沒有說明,但是如果不初始化,執行就會報錯。=========================================================================================對於傳統的機器學習而言,比方說分類問題,[x1 x2 x3]是feature。對於二分類問題,label經過one-hot編碼之後就會是[0,1]或者[1,0]。一般情況下,我們會考慮將資料組織在csv檔案中,一行代表一個sample。然後使用佇列的方式去讀取資料
說明:對於該資料,前三列代表的是feature,因為是分類問題,後兩列就是經過one-hot編碼之後得到的label
使用佇列讀取該csv檔案的程式碼如下:
- #-*- coding:utf-8 -*-
- import tensorflow as tf
- # 生成一個先入先出佇列和一個QueueRunner,生成檔名佇列
- filenames = ['A.csv']
- filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
- # 定義Reader
- reader = tf.TextLineReader()
- key, value = reader.read(filename_queue)
- # 定義Decoder
- record_defaults = [[1], [1], [1], [1], [1]]
- col1, col2, col3, col4, col5 = tf.decode_csv(value,record_defaults=record_defaults)
- features = tf.pack([col1, col2, col3])
- label = tf.pack([col4,col5])
- example_batch, label_batch = tf.train.shuffle_batch([features,label], batch_size=2, capacity=200, min_after_dequeue=100, num_threads=2)
- # 執行Graph
- with tf.Session() as sess:
- coord = tf.train.Coordinator() #建立一個協調器,管理執行緒
- threads = tf.train.start_queue_runners(coord=coord) #啟動QueueRunner, 此時檔名佇列已經進隊。
- for i in range(10):
- e_val,l_val = sess.run([example_batch, label_batch])
- print e_val,l_val
- coord.request_stop()
- coord.join(threads)
輸出結果如下:
說明:
record_defaults = [[1], [1], [1], [1], [1]]
代表解析的模板,每個樣本有5列,在資料中是預設用‘,’隔開的,然後解析的標準是[1],也即每一列的數值都解析為整型。[1.0]就是解析為浮點,['null']解析為string型別 相關文章
- OpenSSL Engine的三種載入方式
- 用 Python 載入資料的 5 種不同方式Python
- 實現圖片懶載入的三種方式
- HBase協處理器載入的三種方式
- 三種 Post 提交資料方式
- 好程式設計師大資料培訓分享HBase協處理器載入的三種方式程式設計師大資料
- js保護內部資料的三種方式JS
- 前端請求後端資料的三種方式!前端後端
- 獲得資料庫操作日誌的三種方式資料庫
- Python種匯入模組的三種方式總結Python
- 簡談檔案下載的三種方式
- 【Tensorflow_DL_Note13】TensorFlow中資料的讀取方式(1)
- 單點登入的三種實現方式
- 淺析SpringBoot載入配置的6種方式Spring Boot
- react中的三種方式實現祖孫資料共享React
- [轉載]HTTP四種常見的POST提交資料方式HTTP
- MYSQL資料匯出備份、匯入的幾種方式MySql
- VS載入lib庫的三種方法
- 載入驅動三種execute
- TensorFlow 入門(MNIST資料集)
- [MySQL光速入門]022 插入資料的兩種方式(番外)MySql
- 資產納管的三種方式介紹
- Express 提交資料的幾種方式Express
- Python 載入 TensorFlow 模型Python模型
- MongoDB中優雅刪除大量資料的三種方式純尹MongoDB
- JavaScript的三種引入方式JavaScript
- 資料來源Parquet之使用程式設計方式載入資料程式設計
- SNP Glue:SAP資料匯入到其他系統的多種方式
- TensorFlow 載入多個模型的方法模型
- 一種新的頁面載入時間檢測方式
- 遍歷資料夾的幾種方式
- linux重新載入nginx配置的三種辦法LinuxNginx
- springAOP的三種實現方式Spring
- selenium中的三種等待方式
- WiFi攻擊的三種方式WiFi
- Selenium裡的三種等待方式
- flowable 部署流程的三種方式
- hibernate的三種查詢方式