書-Deep Learning 用Python 進行深度學習的基礎理論實作
※批次處理
※從資料中學習
※損失函數
※均方誤差
※交叉熵(ㄉ一)誤差
批次處理
上一篇在做訓練的時候是一張一張照片讀進去訓練,那如果一次都進去100張,訓練速度會比較快嗎?答案是可以的因為多數處理數值運算的函式庫,都進行最佳化,可以更有效的處理,因為一次加入很多所以可以更有效的分配運算時的比例,會比你一張一張做還要更快。
這是沒有批次處理的。
第37行就是我們要一次讀取100個照片(陣列)
第39行for有三個參數解釋為從0~60000每次加100所以會變成0、100、200...59800、59900
第40行為切片,取得[0:0+100]、[100:100+100]...個陣列
第42行axis=1為從輸出0~9之找出最大值,axis=0為從784個陣列中(一開始的輸入)找出最大值。
第43行就兩個陣列如果相同的內容就會是True,然後使用np.sum就會把所有True加起來。
從資料中學習
當神經元多起來的時候根本不可能用人工的方式去做調整,所以我們要從資料下手,打個比方,電腦看數字跟人類看數字的思考一定是不一樣,在做機器學習時盡量避免人的介入,從資料中找答案,但是如果每個人的字體都是一樣的,就可以用程式的方式去做判斷,但是每個人的字體都有個人的特色,幾乎很難去定義,所以有人想到了可以取得字體的'特徵量'。
前面的手寫辨識有分訓練資料跟測試資料,先利用訓練資料進行訓練後再經過測試資料來看看這個神經網路的效果好不好,當然不是越多越好,如果訓練過多會出現一個叫做'過度擬合(overfitting)'的狀態,因為太注意這個特徵而忽略了其他的特徵導致辨識效果不好。
損失函數
簡單來說就是代表這個神經網路'好壞'的指標,下面會介紹幾個損失涵數(loss function)。
均方誤差
損失函數中有名的均方誤差(mean squared error)。
yk為輸出資料,tk為訓練資料,k表示資料的維度。
拿手寫辨識舉例
第6行為輸出0~9,可以發現「2」為0.7就代表判斷為2。
第7行為正確答案也是「2」,所以輸出的數字很小就代表這個神經網路不錯。
下面這個是輸出「2」但是正確答案是「3」,可以發現數字很大,就代表有進步的空間。
交叉熵(ㄉ一)誤差
第一次看到念(ㄕㄤ)查過念(ㄉ一)。交叉熵誤差(cross entropy error)。
log是底為e的自然對數(loge),跟均方誤差一樣y為輸出t為答案。
當輸出的值越接近1的時候,數字越小。
輸出:0.7
輸出:0.8
當輸出最大為「3」正確答案為「2」。
3
數字超大。
我們可以知道數字越小神經網路的越好。