Tensorflow入門教程(7)

上次文章

閆17:Tensorflow入門教程(6)?

zhuanlan.zhihu.com圖標

本次對應代碼:

https://github.com/SaoYan/LearningTensorflow/blob/master/exp12_user_dataset_low_API_2.py?

github.com

同步連載於個人公眾號「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這裡的中括弧刪掉了,具體原因主頁菌能力有限無法解釋,可以參見這個鏈接(可能需要科學上網)

stackoverflow.com/quest

  • 改動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?

www.tensorflow.org


推薦閱讀:

在CentOS 7下搭建機器學習環境
第三章 線性模型
機器學習基石筆記10:邏輯斯蒂(Logistic)回歸 上
Paper Reading | 多角度講解自動駕駛中的激光雷達感知系統
《小王愛遷移》系列之十三:在線遷移學習(online transfer learning)

TAG:TensorFlow | 深度學習DeepLearning | 機器學習 |