對于許多機器學習算法來說,最終要解決的問題往往是最小化一個函數,我們通常稱這個函數叫損失函數。在神經網絡里面同樣如此,損失函數層(CostLayer)和Optimizers因而應運而生(……),其中:
CostLayer 用于得到損失
Optimizers 用于最小化這個損失
需要一提的是,在神經網絡里面,可以這樣來理解損失:它是輸入 x 經過前傳算法后得到的輸出和真實標簽y 之間的差距。如何定義這個差距以及如何縮小這個差距會牽扯到相當多的數學知識,我們這里就只講實現,數學層面的內容(有時間的話)(也就是說基本沒可能)(喂)會在數學系列里面說明。感謝萬能的 tensorflow,它貼心地幫我們定義好了損失函數和 Optimizers,所以我們只要封裝它們就好了
CostLayer
先定義一個基類:
相當于我們把 Layer 的激活函數“偷換”成了損失函數。calculate 函數用于直接計算損失,它只在復雜模型中分析模型表現時用到,可以暫時不管
再定義實際應用的 CostLayer,我們以應用最廣泛的 CrossEntropy 為例:
Optimizers
這一部分的封裝做得更加沒有營養,大部分代碼都僅僅是為了和我自己造的輪子的接口 一致。最關鍵的部分只有兩行:
其中 self._opt 是 tensorflow 幫我們定義好的 Optimizers 中的一個,它的作用也很簡單粗暴:更新 session 中的各個變量以使得損失 x 向最小值邁進
以上,CostLayer 和 Optimizers 的定義、功能和實現就說得差不多了;再加上前幾章,一個完整的、較樸素的神經網絡就完全做好了,它支持如下功能:
自定義激活函數
任意堆疊 Layer
通過循環來堆疊重復的結構
通過準確率來評估模型的好壞
這不算是一個很好的模型、但已經具有了基本的雛形,走到這一步可以算是告一段落。接下來如果要拓展的話,大致流程會如下:
在訓練過程中記錄下當前訓練的結果、從而畫出類似這樣的曲線:
讓模型支持比較大規模數據的訓練,它包括幾個需要改進的地方:
我們目前沒有把數據分割成一個個小 batch 來訓練我們的模型;但當數據量大起來的時候、這種處理是不可或缺的
我們目前做預測時是將整個數據扔給模型讓它做前傳算法的。數據量比較大時,這樣做會引發內存不足的問題,為此我們需要分批前傳并在最后做一個整合
我們目前沒有進行交叉驗證,這使我們的模型比較容易過擬合。雖然其實讓用戶自己去劃分數據也可以,但留一個接口是好的習慣
最后也是最重要的,當然就是把我們的模型擴展成一個支持 CNN 模型了。這是一個巨坑、且容我慢慢來填……
-
神經網絡
+關注
關注
42文章
4771瀏覽量
100773
原文標題:從零開始學人工智能(6)--Python · 神經網絡(五)· Cost & Optimizer
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論