深度学习导论(4)神经网络基础
深度學(xué)習(xí)導(dǎo)論(4)神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
- 一. 訓(xùn)練深度學(xué)習(xí)模型的步驟
- 二. 線性層(或叫全鏈接層)(Linear layer(dense or fully connected layers))
- 1. 定義一個(gè)層
- 2. 定義多個(gè)層
- 3. 堆疊線性Layers(層)沒有意義
- 三. 激活函數(shù)
- 1. 再談激活函數(shù)
- 2. Sigmoid
- 3. Tanh
- 4. ReLU
- 5. 如何在PyTorch上實(shí)現(xiàn)激活函數(shù)的調(diào)用
- 四. 搭建神經(jīng)網(wǎng)絡(luò)模型
- 1. torch.nn module
- 2. 基于PyTorch搭建神經(jīng)網(wǎng)絡(luò)模型
- 3. 針對不同機(jī)器學(xué)習(xí)問題的模型結(jié)構(gòu)
- 五. Loss function(損失函數(shù))
- 六. Optimizer(優(yōu)化方法)
- 七. 訓(xùn)練(學(xué)習(xí))過程(Training(learning)procedure)
- 八. MNIST-PyTorch實(shí)現(xiàn)
- (1) 代碼
- (2) 改變batch并輸出input.size
- (3) 改變batch并輸出out.size
- (4) 深度學(xué)習(xí)的本質(zhì)思想
- 九. 計(jì)算損失函數(shù)
- 十. 更新權(quán)重
- 十一. 手寫數(shù)字識別分類問題具體步驟(Training an handwritten digit classification)
一. 訓(xùn)練深度學(xué)習(xí)模型的步驟
- 建立數(shù)據(jù)通道。即把手里的數(shù)據(jù)預(yù)處理成模型輸入的形式;
- 搭建神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)模型。即神經(jīng)網(wǎng)絡(luò)有幾層,每層中有幾個(gè)神經(jīng)元,神經(jīng)元之間是如何連接的;
- 利用損失函數(shù)評估模型。輸入模型的數(shù)據(jù)Input經(jīng)過訓(xùn)練后(例如: 模型中的參數(shù)權(quán)重矩陣為w1w_1w1?,w2w_2w2?,其中w1w_1w1?為第一層與第二層之間連接的權(quán)重矩陣,w2w_2w2?為第二層與第三層之間連接的權(quán)重矩陣,)輸出的預(yù)測值Output,與輸入數(shù)據(jù)的真實(shí)值(即標(biāo)簽Lable)之間的誤差,誤差的結(jié)果就是損失,然后根據(jù)誤差的值反過來去調(diào)整模型中的參數(shù)w1w_1w1?與 w2w_2w2?,如此反復(fù)地進(jìn)行迭代,一直到找到一組最優(yōu)(或局部最優(yōu))的參數(shù)w1w_1w1?與 w2w_2w2?。
- 使用優(yōu)化算法優(yōu)化神經(jīng)網(wǎng)絡(luò)模型權(quán)重。在反復(fù)迭代的過程中,需要不斷地更新w1w_1w1?與 w2w_2w2?,這兩個(gè)矩陣如何更新,就是優(yōu)化算法。優(yōu)化算法一般都是基于梯度下降法來更新w1w_1w1?與w2w_2w2?(神經(jīng)網(wǎng)絡(luò)有很多優(yōu)化方法)。
二. 線性層(或叫全鏈接層)(Linear layer(dense or fully connected layers))
1. 定義一個(gè)層
(1) 所有的層的模塊都在torch.nn中;
(2) 輸入是10個(gè)神經(jīng)元,輸出是5個(gè)神經(jīng)元,“bias為指定是否加入偏置項(xiàng)b”;
(3) “inp = torch.randn(1, 10)”表示輸入的神經(jīng)元。其中“1”表示的是batch,即每個(gè)批次送入的樣本數(shù),“10”表示的是每個(gè)batch中每個(gè)元素有10個(gè)維度;
(4) “out = mylayer(inp)”表示輸入層。實(shí)際上就相當(dāng)于一個(gè)函數(shù),將輸入inp送入到模型中去;
(5) “mylayer.weight”表示權(quán)重w。w的矩陣Size為[5, 10]。
注: w為權(quán)重矩陣。這里以輸入為3個(gè)神經(jīng)元,輸出為2個(gè)神經(jīng)元為例。
如上圖所示,則權(quán)重矩陣w=[w11w12w13w21w22w23]w=\begin{bmatrix} w_{11} & w_{12} & w_{13}\\ w_{21} & w_{22} & w_{23}\end{bmatrix}w=[w11?w21??w12?w22??w13?w23??],www的維度就是兩行三列。
以batch = 3舉例,如下:
可以發(fā)現(xiàn),www權(quán)重矩陣并沒有改變,這是因?yàn)槲覀儧]有去更新它。
2. 定義多個(gè)層
(1) 第一層輸入神經(jīng)元數(shù)量為10,輸出神經(jīng)元數(shù)量為5;
(2) 第二層輸入神經(jīng)元數(shù)量為5,輸出神經(jīng)元數(shù)量為2;
(3) 把第一層作為第二層的輸入,這樣兩個(gè)層就串起來了。
神經(jīng)網(wǎng)絡(luò)就是這樣串起來的,把前一個(gè)層的輸出作為后一個(gè)層的輸入。
3. 堆疊線性Layers(層)沒有意義
如圖所示:
堆疊完后還是相當(dāng)于一層,只不過權(quán)重值由3變?yōu)榱?,所以堆疊線性層是沒有任何意義的,因?yàn)闄?quán)重Weight(www)是學(xué)習(xí)出來的,用兩層堆疊起來和直接用一層的效果是一樣的。所以我們需要考慮如何將線性層變?yōu)榉蔷€性層,這就需要引出激活函數(shù)。
三. 激活函數(shù)
1. 再談激活函數(shù)
- 激活函數(shù)可以將線性模型的輸出限定在一定的范圍內(nèi)。
- 通過堆疊經(jīng)過激活函數(shù)非線性化后的線性模型,可以高度逼近非線性過程。
- 我們不需要關(guān)心用來表示數(shù)據(jù)的確切的函數(shù)類型,只是把深度神經(jīng)網(wǎng)絡(luò)模型看做一個(gè)通用逼近器或參數(shù)估計(jì)方法。
- 常用激活函數(shù):
- Sigmoid
- Tanh
- ReLU
- LeakyReLU
2. Sigmoid
當(dāng)輸入趨近于無窮小時(shí),函數(shù)的值就趨近于0; 當(dāng)輸入趨近于無窮大時(shí),函數(shù)的值就趨近于1。所以經(jīng)過Sigmoid激活函數(shù)后,輸出就壓縮到了(0, 1)之間。
3. Tanh
4. ReLU
當(dāng)輸入小于0時(shí),輸出等于0; 當(dāng)輸入大于0時(shí),輸出等于輸入本身。
5. 如何在PyTorch上實(shí)現(xiàn)激活函數(shù)的調(diào)用
四. 搭建神經(jīng)網(wǎng)絡(luò)模型
1. torch.nn module
- torch.nn module專門用來構(gòu)建神經(jīng)網(wǎng)絡(luò),其包含了構(gòu)建所有神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的模塊,在PyTorch中將這些模塊成為module(在其他框架中一般成為layers)。
- 所有PyTorch module均繼承自torch.nn基類。
2. 基于PyTorch搭建神經(jīng)網(wǎng)絡(luò)模型
3. 針對不同機(jī)器學(xué)習(xí)問題的模型結(jié)構(gòu)
- Linear layer: 線性層(一般用于輸出層、輸入層或中間層)
- Long Short-Term Memory(LSTM): 長短時(shí)網(wǎng)絡(luò),一種RNN網(wǎng)絡(luò)(一般用于輸入層或中間層)
- CNN: 卷積神經(jīng)網(wǎng)絡(luò)(一般用于輸入層或中間層)
- The last layer: 輸出層
- Linear layer: for regression problem
對于回歸問題,一般采用線性層。 - Sigmoid activation function: for binary classification problem
對于二分類問題,一般采用Sigmoid激活函數(shù)。 - Softmax layer: for multi-class classification problem
對于多分類問題,一般采用Softmax層。
- Linear layer: for regression problem
舉例: 非線性網(wǎng)絡(luò)可以這樣理解: 首先是一些線性層(Linear layer),線性層后邊加上非線性層(如ReLU函數(shù)),然后ReLU的輸出又傳送到線性層當(dāng)中,然后在線性層的后邊又加上非線性層(如ReLU函數(shù)),…… ,最后加入輸出層,輸出層要根據(jù)任務(wù)來決定。
五. Loss function(損失函數(shù))
常用的損失函數(shù):
-
L1 loss: Mostly used as a regularizer.(一般用于正則化或規(guī)格化)
-
MSE loss(均方差誤差): used as loss function for regression problems(一般用于回歸問題中): 1n∑(Y^?Y)2\frac{1}{n}\displaystyle \sum{(\hat{Y}-Y)^2}n1?∑(Y^?Y)2其中Y^\hat{Y}Y^為模型預(yù)測值,YYY 為真實(shí)值。
-
Cross-entropy loss: used for binary and multi-class classfication problems(一般用于二分類或者多分類問題)
對于神經(jīng)網(wǎng)絡(luò)模型來說,就是像搭積木一樣搭建一個(gè)網(wǎng)絡(luò)模型,再根據(jù)具體的任務(wù)指定一個(gè)損失函數(shù),然后根據(jù)損失函數(shù)的值去更新模型的權(quán)重(www和bbb),這樣就能找到一組最優(yōu)(或者局部最優(yōu))的www和bbb。在搭建神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的時(shí)候,中間到底用幾個(gè)隱藏層,每一層當(dāng)中用幾個(gè)神經(jīng)元,這些問題就是模型的超參數(shù)。
常用的超參數(shù)有Learing rate、層數(shù)、每層神經(jīng)元數(shù)量等,超參數(shù)的設(shè)定沒有具體原則,就是根據(jù)自己數(shù)據(jù)集的特點(diǎn)或者分布多嘗試。
六. Optimizer(優(yōu)化方法)
如何去更新模型的權(quán)重www和bbb,向左或者向右,每次走多遠(yuǎn),怎么去走,這就是優(yōu)化問題,這也是一種類型的超參數(shù)。
常用的優(yōu)化方法:
- SGD
- Adagrad
- Adam
- RMSProp
一般來說認(rèn)為Adam比較好用,但是有些問題使用最原始的SGD效果反而更好,需要具體問題具體分析。
七. 訓(xùn)練(學(xué)習(xí))過程(Training(learning)procedure)
- Define the neural network that has some learnable parameters(or weights)
- Iterate over a dataset of inputs
- Process input though the network
- Compute the loss(how far is the output from being correct)
- Propagate gradients back into the network’s parameters
- Update the weights of the network,typically using a simple update rule:weight=weight?learning_rate?gradientweight=weight-learning\_rate*gradientweight=weight?learning_rate?gradient
- 定義一個(gè)神經(jīng)網(wǎng)絡(luò),里邊有一些可學(xué)習(xí)的參數(shù)(www和bbb)。可學(xué)習(xí)的意思就是不需要人為的計(jì)算,只需要機(jī)器去學(xué)習(xí)自動(dòng)幫我們找到最優(yōu)(或者局部最優(yōu))的參數(shù);
- 將數(shù)據(jù)集作為輸入,反復(fù)地進(jìn)行迭代;
- 通過模型進(jìn)行輸入;
- 計(jì)算損失值Loss(預(yù)測值與真實(shí)值之間的誤差到底有多大);
- 將梯度傳播回模型的參數(shù)中(梯度下降法),即根據(jù)Loss值去反向的更新模型的權(quán)重www和bbb;
- 一般情況下,使用如下規(guī)則去更新www和bbb: weight=weight?learning_rate?gradientweight=weight-learning\_rate*gradientweight=weight?learning_rate?gradient
八. MNIST-PyTorch實(shí)現(xiàn)
在輸入層前邊是沒有權(quán)重的,即就是原始的輸入數(shù)據(jù),在輸入層和隱藏層之間有權(quán)重,在隱藏層和輸出層之間有權(quán)重,所以對于這個(gè)模型,我們需要定義兩個(gè)層次,而且是兩個(gè)線性層。
注:
- 在__init__函數(shù)中定義模型中的“層”。其中fc1為隱藏層,fc2為輸出層。對于fc1層來說,輸入就是輸入層直接送入模型的數(shù)據(jù),即28*28=784維的向量,共有512個(gè)神經(jīng)元; 對于fc2層來說,輸入就是前一個(gè)層的神經(jīng)元個(gè)數(shù),即512維向量,因?yàn)槭鞘謱憯?shù)字識別,共有數(shù)字0~9,使用one-hot向量表示lable,所以,輸出的神經(jīng)元有10個(gè)。(例如: 0123456789,如果只有“0”上有輸出,其它沒有,那么輸出就是“1000000000”,同理,如果只有“1”上有輸出,那么就是“0100000000”)。 在輸入層的神經(jīng)元后有一個(gè)SoftMax函數(shù),目的是將神經(jīng)元的輸出概率范圍壓縮在(0, 1)之間,且所有概率值加起來的和等于1。看概率哪個(gè)最大,那么就屬于哪一類。(例如,在手寫數(shù)字識別中,“0”的概率比其他數(shù)字都大,那么認(rèn)為手寫數(shù)字屬于“0”這一類,所以,輸出就是“1000000000”)。然后再和樣本的真實(shí)值作對比得到損失值(例如,這個(gè)樣本的標(biāo)簽就是“1000000000”,那么這個(gè)樣本的損失值Loss=0)。
- bias默認(rèn)為True。
- 一個(gè)神經(jīng)層網(wǎng)絡(luò)的手寫數(shù)字識別,其識別正確率就能達(dá)到80%~90%,這就是神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的厲害之處。
- 如果出現(xiàn)“NameError: name ‘nn’ is not defined”,那么需要添加“import torch.nn as nn”。
(1) 代碼
代碼如下:
import torch from torch.nn import Linear import torch.nn as nn import torch.nn.functional as F from torch.nn import ReLUclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(28 * 28, 512)self.fc2 = nn.Linear(512, 10)def forward(self, x):x = F.relu(self.fc1(x))x = F.softmax(self.fc2(x), dim=1)return xnet = Net() print(net)input = torch.randn(1, 28*28)out = net(input) print(input) print(out)結(jié)果如下:
其中結(jié)果圖中上面的tensor為輸入,下面的tensor為輸出。
注: 在定義forword函數(shù)時(shí),如果不加上SoftMax函數(shù),那么輸出結(jié)果就會(huì)有正數(shù)也有負(fù)數(shù),加上SoftMax函數(shù)后,輸出結(jié)果全部在(0, 1)之間。
(2) 改變batch并輸出input.size
將input = torch.randn(1, 28*28)
改為input = torch.randn(2, 28*28)并輸出input的size
輸出結(jié)果如下:
可以看到輸入數(shù)據(jù)的size為(2, 784),其中“2”表示batch,即每一批(batch)將2個(gè)樣本送進(jìn)模型; “784”表示每個(gè)樣本的維度。
(3) 改變batch并輸出out.size
將代碼改為:
input = torch.randn(200, 28*28)out = net(input) print(input.size()) print(out.size()) print(input) print(out)輸出結(jié)果如下:
可以看到輸入數(shù)據(jù)的size為(200, 784),輸出數(shù)據(jù)的size為(200, 10)。
(4) 深度學(xué)習(xí)的本質(zhì)思想
通過以上實(shí)驗(yàn)可以看出: 深度學(xué)習(xí)的本質(zhì)思想就是在做映射,輸入到輸出之間的映射關(guān)系。
九. 計(jì)算損失函數(shù)
注: “out”就是模型中的輸出,“target”就是模型中的“l(fā)abel”。
十. 更新權(quán)重
模型參數(shù)(以MNIST-PyTorch實(shí)現(xiàn)中的代碼為例):
print(net.parameters())輸出結(jié)果如下:
要查看www和bbb的具體值,需要添加一個(gè)迭代器。
十一. 手寫數(shù)字識別分類問題具體步驟(Training an handwritten digit classification)
- Load and normalizing the MNIST training and test datasets using torchvision;
使用torchvision加載并對MNIST數(shù)據(jù)集規(guī)格化; - Define a Convolution Neural Network
定義卷積神經(jīng)網(wǎng)絡(luò); - Define a loss function
定義損失函數(shù); - Train the network on the training data
利用數(shù)據(jù)經(jīng)過反復(fù)迭代(多輪epoch),訓(xùn)練網(wǎng)絡(luò),得到一組最優(yōu)的(或者局部最優(yōu)的)網(wǎng)絡(luò)參數(shù)(www和bbb); - Test the network on the test data
得到網(wǎng)絡(luò)參數(shù)(www和bbb)后,模型就有了,就可以利用測試集數(shù)據(jù)去測試網(wǎng)絡(luò)模型。
總結(jié)
以上是生活随笔為你收集整理的深度学习导论(4)神经网络基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称 Meta 向管理人员下“最后通牒
- 下一篇: 深度学习导论(5)手写数字识别问题步骤