文章分段:
本篇是接續一、用skeleton code解釋tensorflow model程式執行方式(tf.keras) ep.2,第一篇是先闡述,在規劃深度學習的project的程式架構時,為了之後的方便管理與良好的擴充性,大致上需要注意哪些事情,並且會以虛擬碼帶入,最後以tf.keras實際撰寫一遍。
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儲存的方式相差頗多,預設儲存的方式是用多個檔案分開儲存,基本有checkpoint
、graph.pbtxt
、model.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,不知道你們會不會喜歡這種方式。
一樣,喜歡我的文章,或是有什麼想建議的,歡迎留言,我都會去看的。感謝你的觀看,我們明天見~
閃現:
有點好奇辨識人臉的模型,能不能加入身高的相對資訊,畢竟身形也是判斷這個人身份底依據呀