還在用原生Tensorflow嗎?試試TF-Slim吧
為什麼要用TF-Slim?
tf-slim能夠將搭建、訓練、評估神經網路變的簡單:
通過使用參數域(argument scoping)與更多的高抽象層(layer)與變數,允許用戶定義更加緊湊的模型,而不像原生tensorflow那樣冗餘。這個工具增加了代碼的可讀性與可維護性,減少像粘貼複製參數產生的錯誤,簡化了參數的使用
通過提供常用的正則化方式使得開發模型變的簡單
3.內置了常用的視覺模型(VGG、Alextnet…),你可以把它當做一個黑盒子使用,並且也可以根據自己的需求進行修改
Slim使得擴展複雜的模型變的簡單,最令人興奮的是你可以使用已經存在的checkpoints,去訓練模型,做遷移學習
TF-Slim有哪些組件?arg_scope
data
evaluation
layers
learning
losses
metrics
nets
queues
regularizers
variables
Variables如果使用原生tensorflow創建一個variables,你需要給它一個預定義值,或者初始化機制(如:在高斯模型中隨機取值),而且如果一個變數你想要把它創建在GPU上 ,你需要更加相信的指定。為了解放這個過程,TF-Slim提供了一個包裹函數使得我們更加簡單的定義變數
例如:下面這個例子,不僅指定了初始化方式、使用L2正則化方式並且還指定了,這個變數在CPU上生成
在原生tensorflow中有兩類變數,局部變數與全局變數,全局變數一旦被創建,就可以通過saver保存到磁碟中,而局部變數只存在session生命周期中,一點session關閉則就會被清除,不能保存到磁碟中。
TF-Slim進一步區分變數類型,定義了模型變數,模型變數指的是模型中的參數。模型變數是學習過程中被訓練的或者被微調的,在評估模型與推理模型的時候,能夠通過checkpoint文件載入到計算圖(Graph)中。例如:slim.fully_connected o(創建全連接函數)與slim.conv2d (卷積操作)創建的變數就是模型變數
如果您有自己的自定義層或變數創建,但仍然想要TF-Slim來管理您的模型變數,那該怎麼辦呢?
TF-Slim提供了一個簡單便利的方式添加到模型變數集合中
Layers
TF-Slim另外一個高度抽象的方法就是Layers組件,如果使用原生tensorflow創建一個:
創建權重與偏置變數
將輸入變數與權重做卷積操作
加上偏置
應用激活函數,輸出
上面是定義一個卷積層的基礎步驟,如果創建多個呢?比如說vgg-16?為了減少重複代碼,TF-Slim提供了更簡單的方式去定義一個卷積。
為了搭建神經網路,TF-Slim提供了一些標準的實現方式
這裡寫圖片描述
TF-Slim也提供了兩個元運算( meta-operations),repeat與stack,這兩個函數將會更加的精簡代碼。比如在搭建vgg網路過程中,會有很多3*3相同的網路結構,你需要這樣定義:
但是如果使用slim的話,你只需要這樣定義:
在inception網路的Inception-Model中,經常碰到的是相同網路結構,但是參數不同,你可能會這樣定義:
如果使用stack方法的話,你只需要這樣定義:
Scopes
除了name_scope與variable_scope之外,TF-Slim還新添加了一個新的scoping機制叫做arg_scope。允許用戶指定一個或多個操作和一組參數,這些參數將傳遞給arg_scope中定義的每個操作。比如定義三個卷積層,每層都使用L2正則化方式,權重初始化方式都採用標準差為0.01,從高斯函數中隨機取值
不難看出,有很多設置是重複的,所以arg_scope,允許相同範圍內採用一直的參數設置,並且局部的參數設置會覆蓋全局的參數設置
不僅如此,arg_scope還支持嵌套,如下設置全局的激活函數為relu,在全鏈接層設置局部激活函數為None
Losses
TF-Slim也內置了損失函數,
Training Loop
Fine-Tuing已經存在的模型
模型被訓練完以後,可以使用tf.train.Saver保存模型,也可以利用它從checkpoints文件中載入模型
例如:把變數從checkpoint文件中載入到模型中
checkpoint文件就是模型的元數據文件,裡面記載了保存模型的歷史與最新模型的名稱,通過方法,可以得到最近一次ckpt文件的名稱。把變數載入進來,這種方式需要重新運算模型,構造靜態圖,當然也有一種直接把靜態圖也載入進來,就不需要模型代碼了,通過載入模型元數據可以直接恢復靜態圖。
恢復部分模型
有的時候模型很大比如說殘差網路,動輒幾百層,也許你只想觀察某一層,而不想把所有的變數都載入進來,那麼slim也提供了一個簡單的方式
評估 Models
一旦我們訓練了一個模型,我們想看看模型在實踐中表現得如何。這是通過選擇一組評價指標來完成的,這些評價指標將對模型的性能進行評分,而評估代碼實際上是載入數據,執行模型,將結果與一組真實值進行比較,並記錄評估得分。這個步驟可以進行一次或定期重複。網上大多都是粘貼複製,根本沒有進行測試,甚至連代碼能不能運行都不知道,也就是翻譯一番而已,我的環境是tensoflow1.8,執行一直報錯
先以為例,我翻閱了源碼具體操作如下,其實就是取絕對值,那麼這個可能在評價回歸模型比較有用,分類模型就沒啥用處了。同理也就是取平方。
對於,我測試一直報錯,源碼如下:一起分析一下
總結的來說,就是需要設置一個normalizer參數,這個參數要與labels shape相同,如果normalizer為0,則這個label就設置為0,否則就是lable與prediction絕對值與normalizer的商。
這個用法我沒體會到哪裡會用到。也許當你閱讀sllim英文文檔時候,會搞不明白他們的含義,經過我們源碼討論一波,你是不是稍微有點感覺了?
最常用的還是,準確率,精準率,召回率,這點slim還是比較良心的
這裡寫圖片描述


TAG:Microlearner |