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

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