TF初學者指南:如何為機器學習項目創建合適的文件架構
選自MetaFlow
作者:Morgan
機器之心編譯
參與:李亞洲、蔣思源
在這篇文章中,作者根據自己的經驗為 TensorFlow 初學者給出了設計文件、文件夾架構的建議。在管理自己的項目時,這會是非常有幫助的。
在機器學習中,設計正確的文件架構並不簡單。我自己在幾個項目上糾結過此問題之後,我開始尋找簡單的模式,並希望其能覆蓋大部分在讀代碼或自己編代碼時遇到的使用案例。
在此文章中,我會分享我自己的發現。
聲明:該文章更像是建議,而非明確的指導,但我感覺挺成功的。該文章意在為初學者提供起點,可能會引發一些討論。因為一開始我想要為自己的工作設計文件架構,我想我能分享下這方面的內容。如果你有更好的文件架構理論,可以留言分享。
總需要得到什麼?
想下在你做機器學習的時候,你必須要做的是什麼?
需要編寫一個模型
該模型(至少)有兩個不同的階段:訓練階段和推論階段(成果)
需要為該模型輸入數據集(訓練階段)
可能也需要為它輸入單個元素(推論階段)
需要調整它的超參數
精調超參數,需要模型是可配置的,並創造一個類似「API」的存在,至少能讓你推動配置的運行
訓練結果需要好的文件夾(folder)架構(以便於瀏覽並輕易的記住每個實驗)
需要用圖表示一些指標,比如損失或準確率(在訓練以及成果階段)
想要這些圖能夠輕易地被搜索到
想要能夠複製所做的任何實驗
甚至在訓練階段希望跳回前面,以檢查模型
在構造文件和文件夾時,很容易就會忘記以上這些。此外,可能還有其他需求我並未列出。下面,讓我們尋找一些最好的實踐。
整體文件夾架構
一圖勝千言:
文件架構
README 文件:大部分人可能使用 Github,所以請花費些時間,寫一個至少包含以下選項的好的 markdown:安裝、使用、測試、有用的鏈接,來記錄要直接放進 repository 的大型文件。
main.py 文件:獨特的 endpoint,簡單。下面會有更詳細的介紹。你也可以用兩個文檔做為變形(train.py/infer.py)。但在我看來不必要,它通常用來為每個文件建立兩個 API。
數據文件夾:創造一個文件夾,並放進一個腳本來下載數據集。如果需要,讓腳本很好地適配數據文件夾,例如:如果沒有的話,腳本可以創造 trian/val/test 子文件夾。
模型文件夾:該文件夾用來放模型文件。我認為不只有一種方式可處理這個文件夾,你可以為每個模型或每個模型類別寫個文件,甚至可以有一個子文件夾。只要保持一致就行。
__init__ file:下面我會對該文件介紹更多,但它是一個 python 助手(helper),能讓你更容易找到模型,且簡化了模型文件夾的複雜度。
basic_model.py 文件:下面也會對此有所詳介。我認為 TensorFlow 中的大部分模型能共享一個通用架構,後文我會解釋自己的選擇以及原因。
hysearch 文件夾:該文件夾用來存放任何做自定義超參數搜索的助手。如果你使用函數庫,可能就不需要它,但大多時候你總需要自定義些東西。保持這些功能的純粹與單獨性,以便於能簡單地進行測試。
測試文件夾:測試文件夾,當然是用來測試的。你會測試它們,對吧?
結果文件夾:很明顯,該文件夾是用來放結果的。TensorFlow 中更多有關如何提供 TensorBorad 的子文件夾架構的信息,下面很有所介紹。
注釋:請在結果文件夾中添加一個「.gitkeep」文件和為「.gitignore」文件添加一個文件夾。因為你也許不希望將所有試驗都放到 Github 上,並需要避免代碼在首次安裝時因為文件夾丟失而中斷。
這些都是十分基礎的。當然,也許還需要添加其他文件夾,但那些都能歸結到這一基本集中。
通過將良好的 README 和其他 bash 腳本作為輔助。任何人希望使用你的資源庫(repository)都可以通過「Install」命令和「Usage」命令複製你的研究。
基本模型
正如我所說的,我最終意識到模型中的模式是通過 TF 工程化的東西。這一點引領著我我設計了一個非常簡單的類(class),其可以由我未來的模型所擴展。
我並不是繼承類別(class inheritance)的熱衷者,但我也不是永遠清晰複寫一段相同代碼的熱衷者。當你在進行機器學習項目時,模型通過你使用的框架共享了許多相似之處。
所以我試圖找到一個避免繼承的(inheritance)已知香蕉問題(banana problem)的實現,這是通過讓一個繼承儘可能地深而達到。
要完全清楚,我們需要將這一類別作為以後模型的頂部父級類別(top parent),令你模型的構建在一行使用一個變元(one argument):配置(the configuration)。
為了更進一步理解,我們將為你直接展示注釋文件(commented file):
import os, copy
基本模型文件
一些注釋:
關於我配置的「最佳」屬性:人們通常在沒有模型最優超參數的情況下傳送代碼,有人知道為什麼嗎?
隨機函數是靜態的,因為你不想實例化(instantiate)你的模型以訪問它,但為什麼要將其添加到模型本身呢?因為它通常與模型自定義參數綁定。注意,這個函數必須是純粹的(pure),這樣才能根據需要複雜化。
示例 init 函數是最簡單的版本,它會載入現存文件夾或(如果 result_dir 為空)使用 init_op 隨機初始化。
The __init__ script
你能在文件夾結構看到初始化腳本(The __init__ script),其和機器學習並沒有什麼關聯。但該腳本是令你的代碼對你或其他人更加易讀的簡單方式。
該腳本通過添加幾行代碼令任何模型類別都能從命名空間 models 直接可讀取:所以你能在代碼任一處輸入:from models import MyModel,該代碼行能導入模型而不用管模型的文件夾路徑有多麼深。
這裡有一個腳本案例來實現這一任務:
from models.basic_model import BasicModel
這並沒有多高端,但我發現這一腳本十分有用,所以我把它加到本文中了。
API 外殼(The shell API)
我們有一個全局一致的文件夾架構和一個很好的基礎類別來構建我們的模型,一個好的 python 腳本很容易載入我們的類(class),但是設計「shell API」,特別是其默認值是同樣重要的。
因為與機器學習研究交互的主要結束點就是你使用任何工具的外殼(shell),程序外殼是你實驗的基石。
你想要做的最後一件事就是調整你代碼中的硬編碼值來迭代這些實驗,所以你需要從外殼中直接訪問所有的超參數。同樣你還需要訪問所有其他參數,就像結果索引或 stage (HP search/Training/inferring) 等那樣。
同樣為了更進一步理解,我們將為你直接展示注釋文件(commented file):
import os, json
以上就是本文想要描述的,我們希望它能幫助新入門者輔助研究,我們同樣也歡迎自由評論或提問。
在文章最後,作者還列出了一批有關 TensorFlow 文章,感興趣的讀者可通過英文原文查看。
原文鏈接:https://blog.metaflow.fr/tensorflow-a-proposal-of-good-practices-for-files-folders-and-models-architecture-f23171501ae3


※ROOBO攜「布丁豆豆」亮相大會,真正的核心競爭力並不在硬體
※數據分析起家的海雲數據,還想向唇語識別衝刺
※BerryNet:如何在樹莓派上實現深度學習智能網關
※新研究提出內省式學習方法:在分類和生成任務上均表現卓越
※Hadoop沒有消亡,它是大數據的未來
TAG:機器之心 |
※IBM宣稱創建出新的量子演算法 支持機器學習
※基於區塊鏈的機器學習模型創建方案
※微軟和NASA合作創建太空課程計劃
※Wish的創建品牌授權分步指南
※創建一個容器化的機器學習模型
※研究人員結合VR、CAD和3D列印創建機器人建模助手
※中國學者成功創建新型擬人化冠心病小動物模型
※法國CEA展示了創建量子處理器構建模塊的途徑
※尚學鋒:散文有史,創建首推君 ——郭預衡先生訪談錄丨【京師學案】
※如何使用 Beamer 創建演示文稿
※微軟收購深度學習初創公司Lobe 以幫助創建深度學習模型
※創建目標驅動型組織
※創新,即創建新的資源組合
※AI和ML威脅論 創建者確保在設計任何演算法模型時考慮潛在風險
※麻省理工學院創建了植物和機器組成的控制論生命形態
※以「新機制新模式」創建雄安大學
※如何為本地SEO創建kickass鏈接構建策略
※iPhone XS/XS Max 手機如何創建桌面文件夾?
※如何在 Linux 分區或邏輯卷中創建文件系統
※創建教學語境 激發學習興趣