iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 3
1
AI & Data

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

一、用skeleton code解釋tensorflow model程式執行方式(tf.keras) ep.3

文章說明

文章分段:

  1. 文章說明
  2. 簡介datasets
  3. 描述模型訓練的流程
  4. 程式架構:上程式的虛擬碼,預告要寫的檔案、功能有哪些
  5. 主程式的實際撰寫,註明程式開始不能單跑的地方
  6. 總結

本篇是接續一、用skeleton code解釋tensorflow model程式執行方式(tf.keras) ep.2,第一篇是先闡述,在規劃深度學習的project的程式架構時,為了之後的方便管理與良好的擴充性,大致上需要注意哪些事情,並且會以虛擬碼帶入,最後以tf.keras實際撰寫一遍。

其中第2、3段在ep.1,第4段上半在ep.2

 

前情提要

ep.1介紹了2個以不同方式儲存label的datasets及比賽,及講述了我經過幾次嘗試後,整理出模型在訓練時,流程是如何執行,以及要做的事情有哪些。

接著ep.2的部分開始講程式架構的部分,以我之前學習的經驗,向你們分享我覺得好用的project架構,主旨是在說明project中各個資料夾的功能,當你們了解我為什麼會這樣規劃後,希望能對你們的規劃起到靈感的作用,或著如果有出現「為什麼這邊不這樣做?」的想法,歡迎提出來,讓架構能夠更完善!

回憶過前面的內容後,讓我們繼續從上次沒講完的logs/資料夾開始吧!

 

程式架構(續)

logs/

.
└── logs/
     ├── MODEL_NAME.log
     ├── MODEL_NAME_WITH_CONFIG.log
     └── ...

logs資料夾是存放訓練資訊的地方。

訓練資訊會包含hyper parameter的設定、訓練過程中每個batch或每個epoch的training loss(acc等)變化情況、還有每隔一段訓練就會檢驗的validation loss、以及每次的batch size的確切大小(這個也是蠻重要的資訊喔!)等,噢還有dataset的資訊,像是dataset的大小

在最一開始的時候,我採用的是Jason Brownlee博士在How to Plan and Run Machine Learning Experiments Systematically的辦法,即使用excel表格逐一紀錄每次實驗的情況。

這個作法規矩、有效,它可以幫助你建立對於模型實驗的嚴謹性,還有規劃未來的實驗進程。並且可以了解到參數的變化,是如何影響模型的performance。

但是這個做法有一個風險,所有hyper parameter都是手動複製貼上的,難免會出現手滑或ctrl+c突然失靈的情況,導致你在不經意的情況下,擾亂了實驗數據。

補救的措施...大概就是command line按「上」方向鍵去找吧...

 

所以應該要能夠在執行程式的時候,讓hyper parameter能自動紀錄在log檔裡,這樣一旦出現實驗數據混淆的情況,還是能夠循著紀錄得到第一手的資訊。在python語言中,有蠻多package(例如:logging)可以做到這件事。

而我是決定兩個方式都使用,一個是我在處理數據分析時慣用的方式,另一個則是保證能夠還原當時的訓練情況。

而訓練過程產生的loss與acc等資訊,是評估模型穩定性與performance的指標之一,有趣的是,tf.keras在訓練時輸出在終端的資訊,似乎沒有辦法輕易的被導入到log file中的樣子。這就變成需要使用callback這類class,來幫助我們紀錄資訊。callback的使用方式也是後話在提,在此先粗略帶過。

 
 

models/

.
└── models/
     ├── MODEL_NAME/
     |    ├── checkpoint/
     |    |    ├── weights-improvement-0.86.hdf5
     |    |    ├── weights-improvement-0.94.hdf5
     |    |    └── ...
     |    ├── ~~M_N_acc.png~~
     |    └── ~~M_N_loss.png~~
     ├── MODEL_NAME_WITH_CONFIG/
     |    └── ...
     └── ...

models是儲存模型權重與結果的資料夾。在訓練過程中會可以訂定存model權重的規則,有時候訓練會儲存一定數量的權重,所以內層有一個checkpoint資料夾,把所有權重都儲存在這。

至於為什麼叫checkpoint而不是叫weights...我也很好奇

tensorflow用不同的API去儲存「模型+權重」或「權重」時,自帶的副檔名都會不太一樣。.hdf5是用tf.keras進行訓練,用來儲存「模型+權重」或「權重」檔案。這種檔案很有趣,就像前面所說的,.hdf5檔案裡面,有可能是模型連同權重一起儲存,也有可能是單單只有權重而已,也就是說裡面有存什麼東西,是取決於在save時所呼叫的函式

我之前很笨,一直在糾結.hdf5.h5之間的關係,但其實他倆的關係就跟.jpg.jpeg之間的關係一樣..

 

那另外一個tf.estimator儲存的方式相差頗多,預設儲存的方式是用多個檔案分開儲存,基本有checkpointgraph.pbtxtmodel.ckpt-step.xxxxxxxxx,這些就留待後篇在做介紹與比較。

這邊可以先提到一個概念,像tf.estimator這樣儲存權重(應該是沒有儲存模型結構)的方式,可以另外在將其export成.pb的檔案,.pb這種檔案,他就是完整的「模型+權重」,在使用時只需要載入此種檔案,就可以使用。

不過.pb這種檔案呢,想要使用起來方便的話,模型的各tensor名稱一定要管理好,才會知道說要取哪個node作為input,哪個node作為output。

 

至於同層的.png圖片,這個是從tf.keras的train_history取出數值而來的。但我這裡其實犯了一個錯誤,這些圖片是我預設在訓練完成後,用matplolib取用fit()的return值繪製而成的。

有注意到錯誤了嗎?

 
 

A:萬一我的程式在fit()還沒結束時就中斷了,我的圖就畫不了了!等於我遺失掉train_history的資訊了。

那解決這個的辦法,其中之一就是一樣使用Callback class,來彌補這項失誤,一樣,等到進入實際撰寫的時候,會再說明,在此就先略過囉。

 
 
 

小結

這樣看下來會發現,其實logs/models/的功能很像,我甚至有在考慮說是不是要將這兩個資料夾做合併。

但要留哪個名字真的是很讓人猶豫...

 

好了我今天撰寫的時間又來到3小時了,出乎我意料的我又寫不完了,短短的3天讓我大概懂那些寫小說的作家們說的爆字數是什麼感覺了XD。這篇有很多murmur,不知道你們會不會喜歡這種方式。

一樣,喜歡我的文章,或是有什麼想建議的,歡迎留言,我都會去看的。感謝你的觀看,我們明天見~

閃現:
有點好奇辨識人臉的模型,能不能加入身高的相對資訊,畢竟身形也是判斷這個人身份底依據呀


上一篇
一、用skeleton code解釋tensorflow model程式執行方式(tf.keras) ep.2
下一篇
AI實習在做什麼?
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30

尚未有邦友留言

立即登入留言