這僅用於能夠徹底加載到存儲器中的小的數據集有兩種方法:數據結構
使用常數更簡單一些,可是會使用更多的內存,由於常數會內聯的存儲在數據流圖數據結構中,這個結構體可能會被複制幾回。函數
training_data = ... training_labels = ... with tf.Session(): input_data = tf.constant(training_data) input_labels = tf.constant(training_labels)
要改成使用變量的方式,您就須要在數據流圖創建後初始化這個變量。spa
training_data = ... training_labels = ... with tf.Session() as sess: data_initializer = tf.placeholder(dtype=training_data.dtype, shape=training_data.shape) label_initializer = tf.placeholder(dtype=training_labels.dtype, shape=training_labels.shape) input_data = tf.Variable(data_initalizer, trainable=False, collections=[]) input_labels = tf.Variable(label_initalizer, trainable=False, collections=[]) ... sess.run(input_data.initializer, feed_dict={data_initializer: training_data}) sess.run(input_labels.initializer, feed_dict={label_initializer: training_lables})
設定trainable=False能夠防止該變量被數據流圖的GraphKeys.TRAINABLE_VARIABLES收集,這樣咱們就不會在訓練的時候嘗試更新它的值;設定collections=[]能夠防止GraphKeys.VARIABLES收集後作爲保存和恢復的中斷點。設定這些標誌,是爲了減小額外的開銷線程
先看下文件讀取以及讀取數據處理成張量結果的過程:調試
通常數據文件格式有文本、excel和圖片數據。那麼TensorFlow都有對應的解析函數,除了這幾種。還有TensorFlow指定的文件格式。excel
標準TensorFlow格式code
TensorFlow還提供了一種內置文件格式TFRecord,二進制數據和訓練類別標籤數據存儲在同一文件。模型訓練前圖像等文本信息轉換爲TFRecord格式。TFRecord文件是protobuf格式。數據不壓縮,可快速加載到內存。TFRecords文件包含 tf.train.Example protobuf,須要將Example填充到協議緩衝區,將協議緩衝區序列化爲字符串,而後使用該文件將該字符串寫入TFRecords文件。在圖像操做咱們會介紹整個過程以及詳細參數。blog
文件隊列生成函數隊列
產生指定文件張量圖片
文件閱讀器類
閱讀文本文件逗號分隔值(CSV)格式
要讀取每一個記錄是固定數量字節的二進制文件
讀取TfRecords文件
解碼
因爲從文件中讀取的是字符串,須要函數去解析這些字符串到張量
tf.decode_csv(records,record_defaults,field_delim = None,name = None)將CSV轉換爲張量,與tf.TextLineReader搭配使用
tf.decode_raw(bytes,out_type,little_endian = None,name = None) 將字節轉換爲一個數字向量表示,字節爲一字符串類型的張量,與函數tf.FixedLengthRecordReader搭配使用
將文件名列表交給tf.train.string_input_producer函數。string_input_producer來生成一個先入先出的隊列,文件閱讀器會須要它們來取數據。string_input_producer提供的可配置參數來設置文件名亂序和最大的訓練迭代數,QueueRunner會爲每次迭代(epoch)將全部的文件名加入文件名隊列中,若是shuffle=True的話,會對文件名進行亂序處理。一過程是比較均勻的,所以它能夠產生均衡的文件名隊列。
這個QueueRunner工做線程是獨立於文件閱讀器的線程,所以亂序和將文件名推入到文件名隊列這些過程不會阻塞文件閱讀器運行。根據你的文件格式,選擇對應的文件閱讀器,而後將文件名隊列提供給閱讀器的 read 方法。閱讀器的read方法會輸出一個鍵來表徵輸入的文件和其中紀錄(對於調試很是有用),同時獲得一個字符串標量,這個字符串標量能夠被一個或多個解析器,或者轉換操做將其解碼爲張量而且構形成爲樣本。
# 讀取CSV格式文件 # 一、構建文件隊列 # 二、構建讀取器,讀取內容 # 三、解碼內容 # 四、現讀取一個內容,若是有須要,就批處理內容 import tensorflow as tf import os def readcsv_decode(filelist): """ 讀取並解析文件內容 :param filelist: 文件列表 :return: None """ # 把文件目錄和文件名合併 flist = [os.path.join("./csvdata/",file) for file in filelist] # 構建文件隊列 file_queue = tf.train.string_input_producer(flist,shuffle=False) # 構建閱讀器,讀取文件內容 reader = tf.TextLineReader() key,value = reader.read(file_queue) record_defaults = [["null"],["null"]] # [[0],[0],[0],[0]] # 解碼內容,按行解析,返回的是每行的列數據 example,label = tf.decode_csv(value,record_defaults=record_defaults) # 經過tf.train.batch來批處理數據 example_batch,label_batch = tf.train.batch([example,label],batch_size=9,num_threads=1,capacity=9) with tf.Session() as sess: # 線程協調員 coord = tf.train.Coordinator() # 啓動工做線程 threads = tf.train.start_queue_runners(sess,coord=coord) # 這種方法不可取 # for i in range(9): # print(sess.run([example,label])) # 打印批處理的數據 print(sess.run([example_batch,label_batch])) coord.request_stop() coord.join(threads) return None if __name__=="__main__": filename_list = os.listdir("./csvdata") readcsv_decode(filename_list)
每次read的執行都會從文件中讀取一行內容,注意,(這與後面的圖片和TfRecords讀取不同),decode_csv操做會解析這一行內容並將其轉爲張量列表。若是輸入的參數有缺失,record_default參數能夠根據張量的類型來設置默認值。在調用run或者eval去執行read以前,你必須調用tf.train.start_queue_runners來將文件名填充到隊列。不然read操做會被阻塞到文件名隊列中有值爲止。