iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 22
1
AI & Data

從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型系列 第 22

二、教你怎麼看source code,找到核心程式碼 ep.15:如何把tfrecord轉成tf.data的dataset? 3

文章說明

文章分段

  1. 文章說明
  2. deeplab的簡單介紹、於我的意義
  3. tensorflow的程式碼特色
  4. 訓練流程的細節
  5. 逛deeplab的github程式,順序:train.py model.py datasets/data_generator.py …

 

前情提要

*train.py

前個episode把data_generaotr.py裡頭的classDataset的初始化部分講完,在train.py裡生成一個名為dataset的物件後,緊接著就呼叫了他的methodget_one_shot_iterator

今天就要接著從這個method開始講起,開始吧。

 

逛deeplab的github程式(cont.)

datasets/data_generator.py (cont.)


字如其人,碼如其名(?)
這個method的用途就是取得tf.data的Iterator格式的資料,從呼叫這個程式開始,就會開始對tfrecord進行解析與處理。

 



323行呼叫了class內部的method,用途是根據347行的file pattern,將資料夾名稱與split結合,以取得tfrecord檔的路徑。

 

  • 326行把tfrecord檔案路徑放入,num_parallel_reads是要一次從num_readers個tfrecord裡平行取出1個data來,所以有用這個argument,data會是interleave的方式取出;反之如果沒有設定的話,tfrecord檔會依次打開讀取。
  • 推測一旦設定了num_parallel_reads的話,接下來的運算都需要用同樣的parallel數量。
  • 327行是把tfrecord從byte解析回來。
  • 328行是把解析好的data進行前處理。

325-328行還可以分開寫成:

 


這個parse function,接的是tf.data.TFRecordDataset的物件,這個物件會按照一個個tf.example進行解析。

所以他接的參數叫example_xxx。

 


要解析example,就要跟當初定義的key name一樣,然後value的部分放tf.feature(),並根據之前定義的方式,將變數的型態說明清楚。

 


接著將單個example,搭配他的檔案格式,用tf的運算,得到解析完成的feature。

 


238-243行,是分別將data與label的資料decode成為影像,還記得一般data會使用.jpg,label通常會用.png,為了一致性,238、242行皆使用一樣的function進行解析。並且因為不是每種split都需要label,像是test這個split就不需要label的存在,因此241行有額外做一個判斷式。

 


而jpg與png使用相同的function進行解析,就是用了包裝起來的程式去選擇要用的function。

tf.cond()是個方便的method,第一個參數是判別式,第二個參數是判別式為True要執行的;第三個參數則是判別式為False時要執行的。

感覺跟三元判斷子很像。

 


接著245行取得data的名稱,並且處理的時候讓image_name為None的tfrecord也還是可以通過。
要注意的是,在tensorflow裡面,常數的宣告是需要使用tf.constant()的。

 

今天先到這。


上一篇
二、教你怎麼看source code,找到核心程式碼 ep.14:如何把tfrecord轉成tf.data的dataset? 2
下一篇
二、教你怎麼看source code,找到核心程式碼 ep.16:如何把tfrecord轉成tf.data的dataset? 4
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30

尚未有邦友留言

立即登入留言