iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 29
0
AI & Data

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

二、教你怎麼看source code,找到核心程式碼 ep.22:Deeplab的model 部署

文章說明

文章分段

  1. 文章說明
  2. deeplab的簡單介紹、於我的意義 ep.1
  3. tensorflow的程式碼特色 ep.2
  4. 訓練流程的細節 ep.3
  5. 逛deeplab的github程式

 

前情提要


上次說到模型是由一個副程式_build_deeplab去建立的,但由於Deeplab有支援multi GPU,所以在建立整個訓練流程時,需要部署模型與資料,也就是說,我可能需要去看model_deploy這個東西是怎麼處理送來的_build_deeplab

 

好吧,不管怎麼樣,我就先從model_deploy開始看吧。

 

逛deeplab的github程式(cont.)


model_deploy是從deployment這裡import進來的,我從github的deeplab資料夾往上層移動,但沒有看到有叫做deployment的資料夾,所以我又往deeplab的README.md去看,找到Installation的連結,也沒有看到,只有看到slim,所以先去slim資料夾找。

 


幸運的是,部署的功能的確是在slim這個專案內。

 

趕緊來看deployment.py

deployment.py



一開始呼叫的是create_clones(),model_fn的參數放的是_build_deeplab()這個副程式的名字,然後args放的是model_args。

create_clones就是在處理每個GPU上需要的資源:組成模型的tensor。就一般認知而言,每個變數在同一個程式中,必須是不同的名稱,才能正常運作,但是在Deep Learning開出來的模型中,隨便就會產生出好幾百萬個變數,所以在命名時為了方便,可以加入scope,去簡單的把變數分組。

 

具體作法就是:假設今天有個scope叫做「Tesla」,那麼在這個with這個scope底下所有新產生的tensor,他的tensor name都會自帶Tesla/作為標示,像是如果在這個底下建立一個conv layer, 那麼這個conv layer的名稱就會是Tesla/Conv_xx

然後因為slim的API預設會讓convlution layer加上一個bias,所以其實他的名稱會是Tesla/Conv_xx/BiasAdd的樣子

那為了能在不同的clone上辨識同名同姓的tensor,所以在使用multi gpu時,會需要把模型中同樣名稱的tensor,再用scope加入一個可以標示他屬於哪個clone的標示,就是像上圖187行在做的事一樣。

每一層關於scope的部分,都是在處理這個名稱問題。

預備處理好到時候產生model時,各clone需要調整名稱的問題,192行就呼叫了model_fn,然後...*你以為他是return 一個outputs嗎?
*錯了!才不是呢,因為_build_deeplab()這個method根本沒有return值!!沒有吧?


他其實是把model_fn(*args, **kwargs)整個放入outputs這個變數,然後再把它放到Clone裡。

Clone是什麼?


這個要拉到上面看118行,他是一個有名稱的tuple,有outputs:經過模型後的output、scope:會建立在哪個scope裡、device:會在哪片GPU上跑。

然後把設定append進clones變數裡,回傳它。

 

講到這邊,看來似乎得去看_build_deeplab到底在做什麼,才會明白outputs這個欄位放的是什麼東西。

 

 


我暫時無法理解,他在寫這個model_fn時,設定的這三個參數要怎麼從model_args取得,但沒關係,反正我只要知道他會傳過來就行。

總而言之,這個method會取得已經處理好的dataset做成的iterator,和訓練集的分類數量,以及忽略計算的label是哪個。

 


還記得我們的sample格式有key name為common.IMAGEcommon.LABEL的欄位。

  • 231行將samples取出一個batch。
  • 234-235行將取出的資料,用tf.identity把他們轉成同維同shape的tensor value。

後面的ModelOptions的呼叫方式不太懂,希望明天的我會懂。


上一篇
二、教你怎麼看source code,找到核心程式碼 ep.21:從train.py呼叫資料集處,一路看有關處理資料的程式,終於又可以回到train.py了
下一篇
二、教你怎麼看source code,找到核心程式碼 ep.23:Deeplab的model 部署
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30

尚未有邦友留言

立即登入留言