iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 28
1
AI & Data

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

二、教你怎麼看source code,找到核心程式碼 ep.21:從train.py呼叫資料集處,一路看有關處理資料的程式,終於又可以回到train.py了

文章說明

文章分段

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

 

前情提要

ep20把我這幾天以來的文章,標題開頭是二的文章都梳理一遍,然後相信大家絕對不記得,或看到一半會忘記,我到底是從哪裡開始追蹤原始碼,以及為什麼會照這個順序。

我們最初是在train.py遇到他呼叫data_generator.pyget_one_shot_iterator()method,目的是為了取得訓練資料,才開始了長達20天的追蹤。

我們追蹤到現在,好不容易把這個method呼叫的map function:_parse_function_preprocess_image都講完了,最後還剩下一點點的程式,就可以從data_generator.py跳回train.py了。

接著再繼續吧。

 

逛deeplab的github程式(cont.)

datasets/data_generator.py (cont.)

331行是將dataset加上打亂的功能,因為這個tf.data API是講求效率的,所以並不會一次load近所有資料,才能節省佔用GPU的空間。這個buffer_size就是一次會load 100筆資料,然後把它打亂後提供後續使用,也就是說,如果要讓資料完全打亂,buffer_size要比資料筆數多才行(但這樣似乎也失去了使用tf.data有效率的初衷?)。

是說訓練時所需要的記憶體量,如果你是使用GPU的話,你要增加以及關注的記憶體容量是在GPU本身內部的,跟系統的記憶體量沒有關係!
所以如果訓練的程式在沒有確認過記憶體用量的情況下,從用CPU跑,改成用GPU跑,有的時候會出現記憶體不足的情況。
這就是因為,使用GPU,他只會用GPU自帶的記憶體去暫存資料。

 


334行是將資料集的長度延長,會這樣做是因為dataset會變成一個iterator,那iterator呼叫到沒有東西可以丟出來就會結束,所以這個是讓iterator的長度可以變長的method。

 

  • 接下來是338行的batch(),他會規定每呼叫一次dataset iterator,iterator會吐出多少筆資料來。
  • 然後是prefetch(),prefetch的功用是用來增加效率的,他的角色很像是在校長旁邊的大使。

在校長頒獎時,旁邊會有大使拿著一疊獎狀供校長拿取,這樣可以快速進行頒獎。

  • 339行就是把前面還在定義操作的dataset,正式把dataset做成iterator,那呼叫這個iterator時,就會按照前面定義的動作,去處理每筆資料,並且把batch個資料打包好吐出來。

 

train.py


我們花了這麼多天去追的程式,在主程式中,只有短短一行呼叫,而且是作為模型參數。

 

歐對了,說來說去還有模型的部分沒有說到,但因為deeplab的程式是有用提供給多GPU的使用者,所以他的模型寫法跟只有一個GPU的寫法差很多。

 


deeplab的model本身定義在_build_deeplab()這個method中,也就是train.py的第221行那裡。

然後之後321行用_build_deeplab()的定義去把模型部署分工,讓不同GPU之間能合作把這個模型訓練起來。

 
 
 

我下次試著描寫這個定義的部分,但剩下2篇的扣打,我想想要怎麼寫才好XD


上一篇
二、教你怎麼看source code,找到核心程式碼 ep.20:總結一下第二篇每個ep在介紹什麼
下一篇
二、教你怎麼看source code,找到核心程式碼 ep.22:Deeplab的model 部署
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30

尚未有邦友留言

立即登入留言