自己如何實現一個全連線網路
阿新 • • 發佈:2018-12-13
自己如何實現一個全連線網路?
1. 目標
- 自己實現一個全連線網路(即,
MLP
(多層感知機)),並最終能在MNIST
資料集上取得 95% 左右的準確率; - 熟悉
BP
(反向傳播的過程); - 熟悉
BGD
mini-BatchSGD
過程;
2. 難點
- 上述的 2 3 處有小坑(如果不細心的話);
- 機器學習的除錯不是程式碼的除錯!(後面再解釋);
3. How to do?
Are you ok?
code 之前你真的準備好了嗎?MLP
- 此處假設你對它已經有所瞭解。如果你之前沒有接觸過,建議先從
Perceptron
- 這裡只規範一下表示
- 此處假設你對它已經有所瞭解。如果你之前沒有接觸過,建議先從
BP
- 提起 BP,不得不說下面的四個公式(建議自己推導一遍)
- 提起 BP,不得不說下面的四個公式(建議自己推導一遍)
- OK,理論就這麼多,是不是很簡單!
- 既然使用
java
,那就來點面向物件的思想- 這次 面向物件 ,應該考慮什麼呢?
- 整個
mlp
中有幾個物件? - 什麼實體是可以擴充套件的?
- 整個
- 我是這麼設計的
- 先看一下類圖(
idea
自動生成的,組合關係沒有顯示出來)
Layer.class
mlp
是由它搭建的
Net.class
,描述的整個全連線網路,其實它就是mlp
CostFunction.clss
,是個介面,它是 代價函式 的抽象,新增新的代價函式只需要實現它
ActivationFunction.class
,是個介面,它是 啟用函式 的抽象,嘗試其他的啟用函式只需要實現它
- 先看一下類圖(
- 這次 面向物件 ,應該考慮什麼呢?
- 是不是已經迫不及待的想 coding 了?
OK Start!
- 測試
- 首先要確定測試方案。其實,在一開始就應該確定了,現在才確定有點違背
軟工
just one, just paly
無所謂了- 前面已經提到此處使用
MNIST
資料集,至於如何讀取可以看看我的上一篇,這裡不再贅述。 - 這裡的測試有兩個目標:1)程式能跑通~~;2)能達到 95% 左右的準確率。
- 前面已經提到此處使用
- 我的除錯過程
- 邏輯中涉及太多運算了,整個過程認認真真地,最終還是寫錯了一處下標。導致準確率為 9%(隨機)。1st failed
- 糾正後,準確率仍沒很大變化,難道還有錯誤?開始質疑自己!然而也發現了新需求:如何快速查錯?於是加入了 日誌邏輯(實現的有點生硬,沒有視為橫切邏輯)。
- 通過分析 日誌檔案,發現權重、偏置的改變過於規則化。於是,讓它們進行隨機初始化。然而,效果一般。2nd failed
- 幾近崩潰!崩潰!幾近要放棄!放棄!Why 靜下心來,查了許多資料。最終在使用 mini-BatchSGD 訓練方式後達到預期效果。++機器學習的除錯不是程式碼的除錯。。。++
- 首先要確定測試方案。其實,在一開始就應該確定了,現在才確定有點違背
- 還需要點什麼(補充設計時遺漏的功能)
- 模型的持久化
- 使用
java
的Serializable
就可以輕而易舉地實現
- 使用
- 其他的暫時還沒想到。。。
- 模型的持久化
4. END
What's the life?
What's the love?
Just do what you like.
Just do it
However, Some things don't just depend on you.