考慮到要是自己去做一個項目,那么第一步是如何把數據導入到代碼中,何種形式呢?是否需要做預處理?官網中給的實例mnist,數據導入都是寫好的模塊,那么自己的數據呢?
一、從文件中讀取數據(CSV文件、二進制文件、圖片或其他格式)
讀取文件,都需要一個閱讀器reader和一個轉換解碼操作decode,不同格式的文件對應不同的接口API。
1)CSV文件:用的文件讀取器和解碼器是 TextLineReader 和 decode_csv 。 下面代碼來自TensorFlow官網,加了注釋。
filename_queue = tf.train.string_input_producer(["file0.csv", "file1.csv"]) #["file0.csv", "file1.csv"]是文件名列表,tf.train.string_input_producer()用來生成文件名隊列,有參數shuffle=True可執行亂序,num_epochs=None可設置文件名字符串的生成次數
#對於輸入管道,輸出文件名字符串到隊列中
reader = tf.TextLineReader()#閱讀器,個人感覺功能同Python的open()。 key, value = reader.read(filename_queue)#參數是文件名隊列,返回一個tuple,key和value,每次返回閱讀器的下一條記錄(一行)。 # Default values, in case of empty columns. Also specifies the type of the # decoded result. record_defaults = [[1], [1], [1], [1], [1]] #定義解析的格式 col1, col2, col3, col4, col5 = tf.decode_csv( value, record_defaults=record_defaults) #將CSV解析為tensor,每列映射為一個tensor,返回一個tensor列表。 features = tf.concat(0, [col1, col2, col3, col4]) #0代表按行合並。參數1是在哪個維度合並,參數2是待合並的值。 with tf.Session() as sess: # Start populating the filename queue. coord = tf.train.Coordinator() #創建一個線程協調器 threads = tf.train.start_queue_runners(coord=coord) #啟動Graph中所有隊列的線程 for i in range(1200): # Retrieve a single instance: example, label = sess.run([features, col5]) #運行,獲取樣本和標簽 coord.request_stop() #請求停止所有線程 coord.join(threads) #等待線程結束
2)二進制文件:用的文件讀取器和解碼器是 tf.FixedLengthRecordReader 和 tf.decode_raw ,讀取固定長度的文件。
decode_raw
操作可以將一個字符串轉換為一個uint8的張量。
3)標准TensorFlow格式:
可以將任意的數據轉換為TensorFlow所支持的格式, 這種方法可以使TensorFlow的數據集更容易與網絡應用架構相匹配。方法就是使用TFRecords文件。
寫入數據后,通過修改 tf.train.Example 的Features,將 protocol buffer 序列化為一個字符串,再通過 tf.python_io.TFRecordWriter 將序列化的字符串寫入 TFRecords文件中。使用tf.TFRecordReader和
tf.parse_single_example
解析器,可以從TFRecords文件中讀取數據。這個parse_single_example
操作可以將 protocol buffer 解析為張量。
二、供給數據feed_dict參數
定義了operation之后,使用sess.run()或tensor.eval()或op.run()時,通過參數feed_dict傳遞數據,該參數是和placeholder配套使用的。先聲明一個占位符,比如x,y。然后在op中使用了x,y進行計算,等到op.run()時,op.run(feed_dict={x:x_batch,y:y_batch})即可。前提是x_batch和y_batch已知,已有數據。