本章包括
1、一個神經網絡的例子
2、張量和張量操作
3、神經網絡如何通過反向傳播和梯度下降來學習
一、一個神經網絡的例子
GitHub鏈接
??使用Python庫Keras學習對手寫數字進行分類的神經網絡(將手寫數字(28*28px)的灰度圖像分為10個類別:0-9;使用MNIST數據集,含有6000張測試圖像,10000張訓練圖像)
1、 在Keras中加載MNIST數據集
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
??其中圖像編碼為numpy數組,label是一個標簽數組(范圍0-9),圖像標簽一一對應,流程:1)向神經網絡提供訓練數據;2)network學習相關的圖像和標簽;3)讓network為test_image生成預測、驗證預測是否與test_label中的標簽匹配,再次建立網絡
2、 網絡架構
from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
??深度學習模型就像是數據處理的篩子由一系列日益完善的數據過濾器—layers組成
選擇三件事,作為編譯步驟的一部分:
1) loss function–衡量模型在訓練上的表現
2) An optimizer 優化器–自行更新的機制
3) 要監控的指標–在這里只關心準確性(正確分類的圖像的分數)
3、 編譯步驟
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
??訓練前,將數據重新整形為網絡所需要的形狀并對其進行縮放,時期在[0,1]內來預處理數據:uint8 255 (6000,28,28)矩陣–>float [0,1] (6000,28*28)數組
4、 準備數據圖像
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
5、 準備標簽
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
??都準備好后,在Keras中通過調用網絡的擬合方法來完成模型與訓練數據相應匹配:
network.fit(train_images, train_labels, epochs=5, batch_size=128)
??顯示訓練數據在網絡丟失和網絡對訓練數據的準確性、輸出在測試數據上的準確性:
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)
二、神經網絡的數據表示—張量
張量是數據的容器 - 幾乎總是數字數據。
1、 標量(0D張量)
??僅包含一個數字的張量稱為標量(或標量張量,或0維張量,或0D張量)。 在Numpy中,float32或float64數字是標量張量(或標量數組)。標量張量有0軸(ndim == 0)。
2、 向量(1D張量)
??數組數組稱為向量或1D張量,1D張量恰好具有一軸。
??注意區分軸與維度,例如:x = np.array([12, 3, 6, 14]); 5D矢量僅具有一個軸并且沿其軸具有五個維度,而5D張量具有五個軸(并且沿著每個軸可以具有任意數量的維度)。
3、 矩陣(2D張量)
??向量數組是矩陣或2D張量,矩陣有兩個軸(通常稱為行和列)。
4、 3D張量和高維張量
x = np.array([[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]],
[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]],
[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]]])
??在視覺上可以將其解釋為數字的立方體。通過在陣列中打包3D張量,可以創建4D張量,依此類推。
5、 三個關鍵屬性:
1) 軸數(等級):ndim
2) 形狀:shape
3) 數據類型:dtype
6、 數據批量的概念
??通常,在深度學習中遇到的所有數據張量中的第一個軸(軸0,因為索引從0開始)將是樣本軸(有時稱為樣本維度)。 在MNIST示例中,樣本是數字的圖像。 此外,深度學習模型不會立即處理整個數據集; 相反,他們將數據分成小批量。 當考慮這種批量張量時,第一軸(軸0)稱為批量軸或批量維度。
7、 數據張量的真實示例,常見的如下:
1) 矢量數據 - 形狀的2D張量(樣本,特征)
一個人的精算數據集,我們考慮每個人的年齡,郵政編碼,和收入。 每個人可以被表征為3個值的向量,因此可以將100,000個人的整個數據集存儲在2D張量形狀(100000,3)中。
2) 時間序列數據或序列數據 - 形狀的3D張量(樣本,時間步長,特征)
按照慣例,時間軸始終是第二軸(索引1的軸)。
股票價格數據集。 每分鐘,我們存儲當前的股票價格,過去一分鐘的最高價格和過去一分鐘的最低價格。因此,每分鐘編碼為一個3D矢量,整個交易日編碼為2D張量 形狀(390,3)(在交易日有390分鐘),250天的數據可以存儲在3D張量的形狀(250,390,3)中。 在這里,每個樣本都是一天的數據
3) 圖像-4D形狀張量(樣本,高度,寬度,通道)或(樣本,通道,高度,寬度)
圖像通常具有三個維度:高度,寬度和顏色深度。
4) 視頻-5D形狀張量(樣本,幀,高度,寬度,通道)或(樣本,幀,通道,高度,寬度)
三、張量運算
在我們的初始示例中,我們通過將Dense圖層堆疊在一起來構建我們的網絡。
1、 元素操作,可以在numpy中十分簡單的就做好
2、 廣播
??廣播包括兩個步驟:1)軸(稱為廣播軸)被添加到較小的張量以匹配較大張量的ndim;2)較小的張量與這些新軸重復,以匹配較大張量的整個形狀
*
3、 np.dot(x,y)—矩陣相乘;
則表示逐個元素相乘
4、 shape()顯示當前矩陣形狀、reshape()改變矩陣形狀
四、神經網絡的引擎:基于梯度的優化
training loop步驟:
1)繪制一批訓練樣本x和相應的目標y。
2)在x上運行網絡(稱為前向傳遞的步驟)以獲得預測y_pred。
3)計算批次上網絡的loss,衡量y_pred和y之間的不匹配。
4)以略微減少此批次損失的方式更新網絡的所有權重。
??更新網絡權重是最難的一個步驟,給定網絡中的單個權重系數,如何計算系數是應該增加還是減少,以及增加多少?一種好的方法是利用網絡中使用的所有操作都是可微分的這一事實,并根據網絡系數計算損耗的梯度。 然后,可以從梯度向相反方向移動系數,從而減少損失。
1、張量運算的導數:梯度
??以張量作為輸入的函數。 考慮輸入向量x,矩陣W,目標y和損失函數損失。 可以使用W計算目標候選y_pred,并計算目標候選y_pred和目標y之間的loss或者 mismatch
y_pred = dot(W, x)
loss_value = loss(y_pred, y)
2、隨機梯度下降
??給定一個可微函數,理論上可以分析地找到它的最小值:已知函數的最小值是導數為0的點,所以我們要做的就是找到所有點,這里導數變為0,并檢查這些點中的哪一個函數具有最低值。應用于神經網絡,這意味著在分析上找到產生最小可能損失函數的權重值的組合。 這可以通過求解W的方程梯度(f)(W)= 0來完成。從梯度更改相反方向的權重,每次丟失的次數會少一些,更新網絡的所有權重的有效方法如下:
1)繪制一批訓練樣本x和相應的目標y。
2)在x上運行網絡以獲取預測y_pred。
3)計算批次上網絡的丟失,衡量y_pred和y之間的不匹配。
4)根據網絡參數計算loss的梯度(反向傳遞)。
5)在與梯度相反的方向上稍微移動參數 - 例如W - = step * gradient - 從而減少批次上的loss。
??為步長因子選擇合理的值非常重要。如果它太小,曲線下降將需要多次迭代,并且它可能會陷入局部最小值。如果步長太大,更新最后可能會帶到曲線上完全隨機的位置。
??注意,小批量SGD算法的一種變體是在每次迭代時繪制單個樣本和目標,而不是繪制一批數據。另外,存在多種SGD變體,其在計算下一個權重更新時考慮先前的權重更新而不是僅僅查看梯度的當前值而不同。
3、反向傳播算法
??將鏈式規則應用于神經網絡的梯度值的計算產生稱為反向傳播的算法(有時也稱為反向模式區分)
五、對第一個例子的總結
這是輸入數據
Numpy,在這里格式化為float32類型:
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
network如下:
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
網絡編譯步驟:
??categorical_crossentropy是用作學習權重張量的反饋信號的損失函數,訓練階段將嘗試最小化。 這種損失的減少是通過小批量隨機梯度下降發生的。 控制梯度下降的特定使用的確切規則由作為第一個參數傳遞的rmsprop優化器定義。
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
最后,訓練循環:
??網絡將開始以128個樣本的小批量重復訓練數據,5次以上(對所有訓練數據的每次迭代稱為紀元)。 在每次迭代時,網絡將根據批次上的損失計算權重的梯度,并相應地更新權重。 在這5個時期之后,網絡將執行2,345個梯度更新(每個時期469個),并且網絡的丟失將足夠低,使得網絡能夠以高精度對手寫數字進行分類。
network.fit(train_images, train_labels, epochs=5, batch_size=128)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
