Python · 神經網路(五)· Cost & Optimizer
(這裡是最終成品的 GitHub 地址)
(這裡是本章用到的 CostLayer 和 Optimizers 的 GitHub 地址)
對於許多機器學習演算法來說,最終要解決的問題往往是最小化一個函數,我們通常稱這個函數叫損失函數。在神經網路裡面同樣如此,損失函數層(CostLayer)和 Optimizers 因而應運而生(……),其中:
- CostLayer 用於得到損失
- Optimizers 用於最小化這個損失
需要一提的是,在神經網路裡面,可以這樣來理解損失:它是輸入 x 經過前傳演算法後得到的輸出和真實標籤y 之間的差距。如何定義這個差距以及如何縮小這個差距會牽扯到相當多的數學知識,我們這裡就只講實現,數學層面的內容(有時間的話)(也就是說基本沒可能)(喂)會在數學系列裡面說明。感謝萬能的 tensorflow,它貼心地幫我們定義好了損失函數和 Optimizers,所以我們只要封裝它們就好了
- CostLayer
- 先定義一個基類: 相當於我們把 Layer 的激活函數「偷換」成了損失函數。calculate 函數用於直接計算損失,它只在複雜模型中分析模型表現時用到,可以暫時不管
- 再定義實際應用的 CostLayer,我們以應用最廣泛的 CrossEntropy 為例:這裡面用的正是 tensorflow 的內置函數
- Optimizers
- 這一部分的封裝做得更加沒有營養,大部分代碼都僅僅是為了和我自己造的輪子的介面 一致。最關鍵的部分只有兩行:其中 self._opt 是 tensorflow 幫我們定義好的 Optimizers 中的一個,它的作用也很簡單粗暴:更新 session 中的各個變數以使得損失 x 向最小值邁進
以上,CostLayer 和 Optimizers 的定義、功能和實現就說得差不多了;再加上前幾章,一個完整的、較樸素的神經網路就完全做好了,它支持如下功能:
- 自定義激活函數
- 任意堆疊 Layer
- 通過循環來堆疊重複的結構
- 通過準確率來評估模型的好壞
============================== 分割線的說 ==============================
這不算是一個很好的模型、但已經具有了基本的雛形,走到這一步可以算是告一段落。接下來如果要拓展的話,大致流程會如下:
- 在訓練過程中記錄下當前訓練的結果、從而畫出類似這樣的曲線:
- 讓模型支持比較大規模數據的訓練,它包括幾個需要改進的地方:
- 我們目前沒有把數據分割成一個個小 batch 來訓練我們的模型;但當數據量大起來的時候、這種處理是不可或缺的
- 我們目前做預測時是將整個數據扔給模型讓它做前傳演算法的。數據量比較大時,這樣做會引發內存不足的問題,為此我們需要分批前傳並在最後做一個整合
- 我們目前沒有進行交叉驗證,這使我們的模型比較容易過擬合。雖然其實讓用戶自己去劃分數據也可以,但留一個介面是好的習慣
- 最後也是最重要的,當然就是把我們的模型擴展成一個支持 CNN 模型了。這是一個巨坑、且容我慢慢來填……
看到這裡的觀眾老爺們可能或多或少會有這樣的感覺:這貨不就是把 tensorflow 的那些東西封裝了一下嗎,如果我想了解演算法細節該怎麼辦?沒關係,正如我在第零章提到過的,我在帶星號的章節中會說明我實現的純 Numpy 演算法,保證盡我所能地讓所有觀眾老爺滿意 ( σω)σ
希望觀眾老爺們能夠喜歡~
(猛戳我進入下一章!( σω)σ )
推薦閱讀:
※黃哥Python 轉載的霸氣文章"Yes, Python is Slow, and I Don』t Care"
※python中WindowsError: [Error 32] 錯誤處理
※梯度下降法快速教程 | 第一章:Python簡易實現以及對學習率的探討
※visual studio code寫Python無法自動補全?
※PyQt5番外篇(2-3):沖頂大會語音答題輔助小工具之解析篇——問題採集