深度學習入門 基於python理論和實踐讀書筆記(六)

第四章 神經網絡學習 第一 二節

從數據中學習

        神經網絡它的特徵就是可以從數據中進行學習,在學習中自動調整權重參數(不用人去手工調整),通過對權重參數的調整,達到更高的準確率。深度學習有時候可以指是端到端機器學習。從原始數據(輸入)獲得目標結果(輸出)。神經網絡的優點就是對所有的問題可以用同樣的流程來解決。通過不斷學習所提供的數據,嘗試發現待求解的問題的模式。與待處理問題無關。

數據驅動

        數據是機器學習的命根子。機器學到的模式都是在數據的基礎上獲取而來的。嘗試從收集到的數據中發現答案(模式)。這樣子就更加能夠避免人爲的介入了。
        數據分爲訓練數據和測試數據。訓練數據用來訓練模型,測試數據用來測試訓練模型的準確率和模型的泛化能力。泛化能力是指處理未被觀察過的數據的能力。所以吧數據分爲測試數據和訓練數據很重要。某個模型可以順利地處理某個數據集,但無法處理其他數據集的情況。只對某個數據集過度擬合的狀態稱爲過擬合。這種情況在機器學習中是要儘量避免的。

損失函數

損失函數是表示神經網絡性能的“惡劣程度”的指標,當前的神經網絡對監督數據在多大程度上不擬合。常用的兩個損失函數有均方誤差和交叉熵差。

均方誤差

公式爲
在這裏插入圖片描述
python代碼

import numpy as np
def  mean_squared_error(y,t):
    return 0.5*np.sum((y-t)**2)
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(mean_squared_error(np.array(y), np.array(t)))

交叉熵

公式爲
在這裏插入圖片描述
log表示以e爲底數的自然對數(log e)。這個公式因爲乘了一個tk。tk中只有正確解標籤的索引爲1,其他均爲0。所以這樣只會比較到正確標籤和對應的該索引預測出來的概率之間的差距。
python 代碼

def cross_entropy_error(y,t):
    delta = 1e-7
    return  -np.sum(t*np.log(y+delta))
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(cross_entropy_error(np.array(y), np.array(t)))

mini-batch學習

計算損失函數的時候必須將所有訓練集數據做爲對象,但是有些訓練集的數據非常之龐大。比如手寫數據集就有6萬個數據,這樣子每一個數據都要計算其損失函數是非常耗時的。神經網絡的學習就是從訓練集中選取一批數據,這批數據就是稱爲mini-batch。然後對每一個mini-batch進行學習。比如說手寫數字中6萬個數據中抽取100個。這種學習就叫做minibatch學習。
python代碼

import sys, os
sys.path.append(os.pardir) # 爲了導入父目錄中的文件而進行的設定
import numpy as np
from dataset.mnist import  load_mnist
(x_train, t_train), (x_test, t_test) = \
 load_mnist(normalize=True, one_hot_label=True)
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000, 10)
train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size,batch_size)
x_bacth = x_train[batch_mask]
t_bacth = t_train[batch_mask]

np.random.choice(60000, 10)會從0到59999之間隨機選擇10個數字。

mini-batch交叉熵誤差

就是進行批量計算交叉熵誤差,第一種是當t是one-hot的時候。
python代碼

def cross_entropy_error(y, t):
     if y.ndim == 1:
         t = t.reshape(1, t.size)
         y = y.reshape(1, y.size)
     batch_size = y.shape[0]
     return -np.sum(t * np.log(y + 1e-7)) / batch_size

這裏唯一要解釋一下的就是爲什麼當處理數據爲單個的數據的時候,需要
t = t.reshape(1, t.size)些這句代碼,它就是給t增加了一維。之前如果你輸出它的shape只有維就是它列的個數,現在它就是行爲一行,列爲之前輸出的。這樣子就如果它本來就大於一的話,它shape[0]就是batch的數量。如果它只有一維的話shape[0]就是列數,就加了一維。讓batch等於1。後面就按照公式來就可以了。
第一種是當t不是one-hot的時候。
python代碼爲

def cross_entropy_error(y, t):
     if y.ndim == 1:
         t = t.reshape(1, t.size)
         print(t)
         y = y.reshape(1, y.size)
     batch_size = y.shape[0]
     print(y[np.arange(batch_size), t])
     return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

對於一個小萌新來說,我真的是理解了好久,寫代碼去驗證自己的猜測。最後理解代碼的意思了,也符合那個公式,首先y[np.arange(batch_size), t] 會生成 NumPy 數 組 [y[0,2], y[1,7], y[2,0], y[3,9], y[4,4]])。然後y[0,2]意思就是假如y是行數爲1,它的數據是y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]這樣子的話,如果t標籤等於[2],就是說明該圖屬於2這個標籤,y[0,2]就是找y矩陣的第一行的三列的數字,比如這裏就是y[0,2]=0.6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章