Tensorflow入門教程(7)
上次文章
閆17:Tensorflow入門教程(6)本次對應代碼:
https://github.com/SaoYan/LearningTensorflow/blob/master/exp12_user_dataset_low_API_2.py同步連載於個人公眾號「SaoYan」
Overview
上次遺留了一個問題:
上次的demo中,全部原始數據都是8bit圖像數據,也是用8bit存儲在TFrecords中。但是實際中有一些數據集提供的是float型數據(例如某些高光譜圖像資料庫,提供的是歸一化光譜響應)。這個時候,每個像素值不再是8bit,那麼存儲和讀取TFrecords就需要一些不一樣的細節處理。
這次的代碼完全基於上一次,只更改了必要的部分,因此這次只把改動的部分一一指出。
實驗設置
這次使用的數據是主頁菌預先存儲好的100張灰度圖像,尺寸180 x 180,存儲格式是HDF5(不需要專門了解,代碼中HDF5數據的讀取簡單易懂),每張圖預先經過了歸一化處理:img = np.float32(img) / 255.
代碼實現的功能與上次相同:製備tfrecords形式的數據集,然後再以mini-batch讀入,為了測試讀入是否成功,把讀入的數據顯示在tensorboard上面。
製備tfrecords數據集
- 改動1:輔助函數中的一個
上次代碼是這樣的:
改成如下:
因為數據變成了float格式,因此相應對接的feature也從Byte變成了Float
注意:value這裡的中括弧刪掉了,具體原因主頁菌能力有限無法解釋,可以參見這個鏈接(可能需要科學上網)
https://stackoverflow.com/questions/41246438/tensorflow-record-with-float-numpy-array
- 改動2:製備TFrecords數據集
上次是用OpenCV從磁碟讀入數據,加入TFrecords,這次的兩個變化是:用HDF5介面讀入數據 & 寫入的數據格式從unit8變成了float。第一個變化不是我們關心的重點。
對於第二個變化,上次代碼是這樣的:
改動以後:
核心區別在高亮的那一行,究其原因還是數據格式的不同。
注意:改動後的代碼手動指定了FeatureList的長度。即在高亮部分手動將數據reshape成一維。在處理unit8數據的時候,類似的功能是由 img.tostring() 完成的,大致可以理解為和FeatureList的一種對接規則。
從tfrecords中載入nimi-batch
- 改動1:讀取函數
上次代碼中定一個函數:read_tfrecord,功能是從數據集中讀取一個樣本:
改動以後:
核心的區別依然在FeatureList的部分
注意:手動指定了FeatureList的長度。作用在於告訴程序要從FeatureList中抽取多少值。例如:本例中圖像尺寸是180 x 180 x 1,那麼讀取一個樣本就意味著從FeatureList中抽取32400個float格式的值。
然而,在處理uint8數據時並不需要手動指定,原因未知。
更改了這個函數之後,後面定義mini-batch,運行Session等都保持不變。
- 改動2:placeholder
上次:
改動後:
統一數據格式,不需要多解釋
運行效果
首先,讀取每個batch以後列印出這個batch中所有像素的最大最小值:
讀取到的的確是我們存儲的歸一化的數據
然後查看Tensorboard顯示的結果:
也完全符合預期。
用6、7兩次的教程解決了使用low level API手擼數據集的問題。很多人可能明顯感覺瑣碎的細節過多,而且內部機理難以理解,很容易出錯。
下次文章介紹Tensorflow封裝好的high level API,這個也是官方推薦使用的,因為它把這些繁瑣的操作都封裝在了內部,使用更方便。
感興趣的同志可以預先去看官方文檔:
https://www.tensorflow.org/programmers_guide/datasets推薦閱讀:
※在CentOS 7下搭建機器學習環境
※第三章 線性模型
※機器學習基石筆記10:邏輯斯蒂(Logistic)回歸 上
※Paper Reading | 多角度講解自動駕駛中的激光雷達感知系統
※《小王愛遷移》系列之十三:在線遷移學習(online transfer learning)
TAG:TensorFlow | 深度學習DeepLearning | 機器學習 |