深度学习导论(4)神经网络基础
深度學習導論(4)神經網絡基礎
- 一. 訓練深度學習模型的步驟
- 二. 線性層(或叫全鏈接層)(Linear layer(dense or fully connected layers))
- 1. 定義一個層
- 2. 定義多個層
- 3. 堆疊線性Layers(層)沒有意義
- 三. 激活函數
- 1. 再談激活函數
- 2. Sigmoid
- 3. Tanh
- 4. ReLU
- 5. 如何在PyTorch上實現激活函數的調用
- 四. 搭建神經網絡模型
- 1. torch.nn module
- 2. 基于PyTorch搭建神經網絡模型
- 3. 針對不同機器學習問題的模型結構
- 五. Loss function(損失函數)
- 六. Optimizer(優化方法)
- 七. 訓練(學習)過程(Training(learning)procedure)
- 八. MNIST-PyTorch實現
- (1) 代碼
- (2) 改變batch并輸出input.size
- (3) 改變batch并輸出out.size
- (4) 深度學習的本質思想
- 九. 計算損失函數
- 十. 更新權重
- 十一. 手寫數字識別分類問題具體步驟(Training an handwritten digit classification)
一. 訓練深度學習模型的步驟
- 建立數據通道。即把手里的數據預處理成模型輸入的形式;
- 搭建神經網絡結構模型。即神經網絡有幾層,每層中有幾個神經元,神經元之間是如何連接的;
- 利用損失函數評估模型。輸入模型的數據Input經過訓練后(例如: 模型中的參數權重矩陣為w1w_1w1?,w2w_2w2?,其中w1w_1w1?為第一層與第二層之間連接的權重矩陣,w2w_2w2?為第二層與第三層之間連接的權重矩陣,)輸出的預測值Output,與輸入數據的真實值(即標簽Lable)之間的誤差,誤差的結果就是損失,然后根據誤差的值反過來去調整模型中的參數w1w_1w1?與 w2w_2w2?,如此反復地進行迭代,一直到找到一組最優(或局部最優)的參數w1w_1w1?與 w2w_2w2?。
- 使用優化算法優化神經網絡模型權重。在反復迭代的過程中,需要不斷地更新w1w_1w1?與 w2w_2w2?,這兩個矩陣如何更新,就是優化算法。優化算法一般都是基于梯度下降法來更新w1w_1w1?與w2w_2w2?(神經網絡有很多優化方法)。
二. 線性層(或叫全鏈接層)(Linear layer(dense or fully connected layers))
1. 定義一個層
(1) 所有的層的模塊都在torch.nn中;
(2) 輸入是10個神經元,輸出是5個神經元,“bias為指定是否加入偏置項b”;
(3) “inp = torch.randn(1, 10)”表示輸入的神經元。其中“1”表示的是batch,即每個批次送入的樣本數,“10”表示的是每個batch中每個元素有10個維度;
(4) “out = mylayer(inp)”表示輸入層。實際上就相當于一個函數,將輸入inp送入到模型中去;
(5) “mylayer.weight”表示權重w。w的矩陣Size為[5, 10]。
注: w為權重矩陣。這里以輸入為3個神經元,輸出為2個神經元為例。
如上圖所示,則權重矩陣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舉例,如下:
可以發現,www權重矩陣并沒有改變,這是因為我們沒有去更新它。
2. 定義多個層
(1) 第一層輸入神經元數量為10,輸出神經元數量為5;
(2) 第二層輸入神經元數量為5,輸出神經元數量為2;
(3) 把第一層作為第二層的輸入,這樣兩個層就串起來了。
神經網絡就是這樣串起來的,把前一個層的輸出作為后一個層的輸入。
3. 堆疊線性Layers(層)沒有意義
如圖所示:
堆疊完后還是相當于一層,只不過權重值由3變為了6,所以堆疊線性層是沒有任何意義的,因為權重Weight(www)是學習出來的,用兩層堆疊起來和直接用一層的效果是一樣的。所以我們需要考慮如何將線性層變為非線性層,這就需要引出激活函數。
三. 激活函數
1. 再談激活函數
- 激活函數可以將線性模型的輸出限定在一定的范圍內。
- 通過堆疊經過激活函數非線性化后的線性模型,可以高度逼近非線性過程。
- 我們不需要關心用來表示數據的確切的函數類型,只是把深度神經網絡模型看做一個通用逼近器或參數估計方法。
- 常用激活函數:
- Sigmoid
- Tanh
- ReLU
- LeakyReLU
2. Sigmoid
當輸入趨近于無窮小時,函數的值就趨近于0; 當輸入趨近于無窮大時,函數的值就趨近于1。所以經過Sigmoid激活函數后,輸出就壓縮到了(0, 1)之間。
3. Tanh
4. ReLU
當輸入小于0時,輸出等于0; 當輸入大于0時,輸出等于輸入本身。
5. 如何在PyTorch上實現激活函數的調用
四. 搭建神經網絡模型
1. torch.nn module
- torch.nn module專門用來構建神經網絡,其包含了構建所有神經網絡結構的模塊,在PyTorch中將這些模塊成為module(在其他框架中一般成為layers)。
- 所有PyTorch module均繼承自torch.nn基類。
2. 基于PyTorch搭建神經網絡模型
3. 針對不同機器學習問題的模型結構
- Linear layer: 線性層(一般用于輸出層、輸入層或中間層)
- Long Short-Term Memory(LSTM): 長短時網絡,一種RNN網絡(一般用于輸入層或中間層)
- CNN: 卷積神經網絡(一般用于輸入層或中間層)
- The last layer: 輸出層
- Linear layer: for regression problem
對于回歸問題,一般采用線性層。 - Sigmoid activation function: for binary classification problem
對于二分類問題,一般采用Sigmoid激活函數。 - Softmax layer: for multi-class classification problem
對于多分類問題,一般采用Softmax層。
- Linear layer: for regression problem
舉例: 非線性網絡可以這樣理解: 首先是一些線性層(Linear layer),線性層后邊加上非線性層(如ReLU函數),然后ReLU的輸出又傳送到線性層當中,然后在線性層的后邊又加上非線性層(如ReLU函數),…… ,最后加入輸出層,輸出層要根據任務來決定。
五. Loss function(損失函數)
常用的損失函數:
-
L1 loss: Mostly used as a regularizer.(一般用于正則化或規格化)
-
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^為模型預測值,YYY 為真實值。
-
Cross-entropy loss: used for binary and multi-class classfication problems(一般用于二分類或者多分類問題)
對于神經網絡模型來說,就是像搭積木一樣搭建一個網絡模型,再根據具體的任務指定一個損失函數,然后根據損失函數的值去更新模型的權重(www和bbb),這樣就能找到一組最優(或者局部最優)的www和bbb。在搭建神經網絡結構的時候,中間到底用幾個隱藏層,每一層當中用幾個神經元,這些問題就是模型的超參數。
常用的超參數有Learing rate、層數、每層神經元數量等,超參數的設定沒有具體原則,就是根據自己數據集的特點或者分布多嘗試。
六. Optimizer(優化方法)
如何去更新模型的權重www和bbb,向左或者向右,每次走多遠,怎么去走,這就是優化問題,這也是一種類型的超參數。
常用的優化方法:
- SGD
- Adagrad
- Adam
- RMSProp
一般來說認為Adam比較好用,但是有些問題使用最原始的SGD效果反而更好,需要具體問題具體分析。
七. 訓練(學習)過程(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
- 定義一個神經網絡,里邊有一些可學習的參數(www和bbb)。可學習的意思就是不需要人為的計算,只需要機器去學習自動幫我們找到最優(或者局部最優)的參數;
- 將數據集作為輸入,反復地進行迭代;
- 通過模型進行輸入;
- 計算損失值Loss(預測值與真實值之間的誤差到底有多大);
- 將梯度傳播回模型的參數中(梯度下降法),即根據Loss值去反向的更新模型的權重www和bbb;
- 一般情況下,使用如下規則去更新www和bbb: weight=weight?learning_rate?gradientweight=weight-learning\_rate*gradientweight=weight?learning_rate?gradient
八. MNIST-PyTorch實現
在輸入層前邊是沒有權重的,即就是原始的輸入數據,在輸入層和隱藏層之間有權重,在隱藏層和輸出層之間有權重,所以對于這個模型,我們需要定義兩個層次,而且是兩個線性層。
注:
- 在__init__函數中定義模型中的“層”。其中fc1為隱藏層,fc2為輸出層。對于fc1層來說,輸入就是輸入層直接送入模型的數據,即28*28=784維的向量,共有512個神經元; 對于fc2層來說,輸入就是前一個層的神經元個數,即512維向量,因為是手寫數字識別,共有數字0~9,使用one-hot向量表示lable,所以,輸出的神經元有10個。(例如: 0123456789,如果只有“0”上有輸出,其它沒有,那么輸出就是“1000000000”,同理,如果只有“1”上有輸出,那么就是“0100000000”)。 在輸入層的神經元后有一個SoftMax函數,目的是將神經元的輸出概率范圍壓縮在(0, 1)之間,且所有概率值加起來的和等于1。看概率哪個最大,那么就屬于哪一類。(例如,在手寫數字識別中,“0”的概率比其他數字都大,那么認為手寫數字屬于“0”這一類,所以,輸出就是“1000000000”)。然后再和樣本的真實值作對比得到損失值(例如,這個樣本的標簽就是“1000000000”,那么這個樣本的損失值Loss=0)。
- bias默認為True。
- 一個神經層網絡的手寫數字識別,其識別正確率就能達到80%~90%,這就是神經網絡結構的厲害之處。
- 如果出現“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)結果如下:
其中結果圖中上面的tensor為輸入,下面的tensor為輸出。
注: 在定義forword函數時,如果不加上SoftMax函數,那么輸出結果就會有正數也有負數,加上SoftMax函數后,輸出結果全部在(0, 1)之間。
(2) 改變batch并輸出input.size
將input = torch.randn(1, 28*28)
改為input = torch.randn(2, 28*28)并輸出input的size
輸出結果如下:
可以看到輸入數據的size為(2, 784),其中“2”表示batch,即每一批(batch)將2個樣本送進模型; “784”表示每個樣本的維度。
(3) 改變batch并輸出out.size
將代碼改為:
input = torch.randn(200, 28*28)out = net(input) print(input.size()) print(out.size()) print(input) print(out)輸出結果如下:
可以看到輸入數據的size為(200, 784),輸出數據的size為(200, 10)。
(4) 深度學習的本質思想
通過以上實驗可以看出: 深度學習的本質思想就是在做映射,輸入到輸出之間的映射關系。
九. 計算損失函數
注: “out”就是模型中的輸出,“target”就是模型中的“label”。
十. 更新權重
模型參數(以MNIST-PyTorch實現中的代碼為例):
print(net.parameters())輸出結果如下:
要查看www和bbb的具體值,需要添加一個迭代器。
十一. 手寫數字識別分類問題具體步驟(Training an handwritten digit classification)
- Load and normalizing the MNIST training and test datasets using torchvision;
使用torchvision加載并對MNIST數據集規格化; - Define a Convolution Neural Network
定義卷積神經網絡; - Define a loss function
定義損失函數; - Train the network on the training data
利用數據經過反復迭代(多輪epoch),訓練網絡,得到一組最優的(或者局部最優的)網絡參數(www和bbb); - Test the network on the test data
得到網絡參數(www和bbb)后,模型就有了,就可以利用測試集數據去測試網絡模型。
總結
以上是生活随笔為你收集整理的深度学习导论(4)神经网络基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称 Meta 向管理人员下“最后通牒
- 下一篇: 特斯拉跌落神坛?辅助驾驶横评仅得第七