一、深度學習的簡單概念
????????深度學習是一種模仿人類大腦的運行方式,從大量數據中學習特征的學習模式。
? ? ? ? 深度學習是機器學習的子集,它與機器學習的關系如下:
二、感知神經網絡
2.1簡單定義
????????神經網絡(Neural Networks)是一種模擬人腦神經元網絡結構的計算模型,用于處理復雜的模式識別、分類和預測等任務。
????????神經網絡由多個互相連接的節點(即人工神經元)組成。
三、人工神經元
? ? ? ? 定義:人工神經元是神經網絡的基本構建單位。核心功能是接受輸入信號,經過加權求和∑和非線性激活函數f處理后,輸出結果。
3.1構造人工神經元
? ? ? ? 人工神經元接受信息輸入之后經過加權求和處理,在經過激活函數處理(這個不是非得有的過程),最后將結果輸出。
????????理解圖像如下:
3.2組成部分
? ? ? ? 根據3.1的圖像我們可以觀察到x,w,b,∑,f,現進行一一解釋:
(1)X:輸入input,代表輸入數據,通常包含n個特征量,即用向量表示。每一個輸入值對應一個權重;
(2)W:權重weight,每一條輸入數據都有自己的權重,它表示的是該輸入對最終結果的重要程度;
(3)b:偏置bias,一個可調參數,類似于截距,幫助調整模型的輸出;
(4)∑:加權求和,輸入數據*權重之后再求和,最后加上偏置;
(5)f:激活函數,用于將加權求和后的結果轉換為輸出結果,引入非線性特性,使神經網絡能夠處理復雜的任務。
3.3數學表示
數學公式:
3.4對比生物神經元
人工神經元和生物神經元對比如下表:
生物神經元 | 人工神經元 |
---|---|
細胞核 | 節點 (加權求和 + 激活函數) |
樹突 | 輸入 |
軸突 | 帶權重的連接 |
突觸 | 輸出 |
四、深入神經網絡(重點)
? ? ? ? 神經網路是由大量神經單元連接構成的計算模型。每一個神經元的輸出作為下一層的輸入,最后得到神經網絡的輸出。
4.1基本結構
(1)輸入層:神經網絡的第一層,主要是接收輸入信息,不進行計算;
(2)隱藏層:位于輸入層和輸出層之間,進行特征提取和轉換。一般有多個層,且每一層一般有多個神經單元;
(3)輸出層:神經網絡的最后一層,產生最終的結果。
4.2網絡構建
神經元:方框
4.3全連接神經網絡
定義:每一層的神經元與上一層的所有神經元全連接,一般用于圖像分類,文本分類等任務。
?根據3.1的圖像我們可以觀察到x,w,b,∑,f,并且進行了一一解釋:
(1)X:輸入input,代表輸入數據,通常包含n個特征量,即用向量表示。每一個輸入值對應一個權重;
(2)W:權重weight,每一條輸入數據都有自己的權重,它表示的是該輸入對最終結果的重要程度;
(3)b:偏置bias,一個可調參數,類似于截距,幫助調整模型的輸出;
(4)∑:加權求和,輸入數據*權重之后再求和,最后加上偏置;
(5)f:激活函數,用于將加權求和后的結果轉換為輸出結果,引入非線性特性,使神經網絡能夠處理復雜的任務。
現在我們要了解一下這幾個參數的數據形式,如何組成的:
(1)X輸入:(batch_size,in_features),輸入樣本條數,輸入特征數量;
(2)W權重:(out_features,in_features),輸出特征數量,輸入特征數量;
(3)b偏置:(out_features),輸出特征數量;
(4)Z輸出:(batch_size,out_features),輸入樣本條數,輸出特征數量;
? ? ? ? 4.3.1特點
全連接神經網絡的特點
(1)全連接層:層與層之間都是相互連接的,后一個神經元與前一個神經元相連;
(2)權重數量:神經元之間是全連接的,權重數都不相同,權重個數多(權重數量太高容易導致模型復雜度高,計算量大,消耗時間長);
(3)學習能力強:能夠學習輸入數據的全局特征。
? ? ? ? 4.3.2計算步驟
(1)數據傳輸:輸入數據經過每一層的計算,逐層傳遞到輸出層;
(2)激活函數:每一層的輸出通過激活函數處理后再輸出;
(3)損失計算:在輸出層計算預測值與真實值之間的差距,即損失函數值;
(4)反向傳播:通過backward算法計算每個權重的梯度,并更新權重。
? ? ? ? 4.3.3基本組件認知
4.3.3.1線性層組件
(1)介紹
? ? ? ? 線性層:神經網絡中常用的層類型,主要用于將輸入數據通過線性變換映射到輸出空間。
API:
from torch import nn
nn.Linear(in_features,out_features,bias=True)
解釋:
in_features:輸入特征的數量;
out_features:輸出特征的數量;
bias:是否設置偏置項,為True則表示設置偏置,為False則表示不設置偏置。
注意:定義單線性層的時候可以不用寫類方法,直接調用nn.Linear就好。
非單線性層時,要注意后一層的輸入要與前一層的輸出對應,要填一樣。
(2)代碼實現
有兩種實現方式:
a.自定義類,依次完成對初始化、對前向方法的描述;
(1)自定義神經網絡類,繼承nn.Model;
(2)初始化方法,定義線性層;
(3)實現前向傳播方法
代碼示例:
import torch
from torch import nnclass mynn(nn.Module):def __init__(self,input_size):super().__init__()# 定義線性層self.fc1 = nn.Linear(input_size,64)self.fc2 = nn.Linear(64,32)self.fc3 = nn.Linear(32,1)def forward(self,x):x = self.fc1(x)x = self.fc2(x)x = self.fc3(x)return xinput_size = 32
model = mynn(input_size)
print(model)
結果:
mynn(
(fc1): Linear(in_features=32, out_features=64, bias=True)
(fc2): Linear(in_features=64, out_features=32, bias=True)
(fc3): Linear(in_features=32, out_features=1, bias=True)
)
b.調用nn.Sequential模型,不用再寫對前向傳播的邏輯描述。
(1)定義輸入特征量;
(2)直接調用API,創建模型;
(3)打印結果
代碼示例:
from torch import nn
in_featrues = 32
model = nn.Sequential(nn.Linear(in_featrues,64),nn.Linear(64,32),nn.Linear(32,1)
)
print(model)
結果:
Sequential(
(0): Linear(in_features=32, out_features=64, bias=True)
(1): Linear(in_features=64, out_features=32, bias=True)
(2): Linear(in_features=32, out_features=1, bias=True)
)
4.3.3.2激活函數組件
定義:主要是運用在隱藏層引入非線性,讓神經網絡學習更復雜的規律,使網絡具備非線性能力,增強其表達能力。
常見的損失函數:
API:import torch.nn.function as F
(1)sigmoid函數:會出現梯度消失問題 sigmoid = F.sigmoid()
(2)tanh函數:會出現梯度消失問題 tanh = F.tanh()
(3)ReLU函數:x小于等于0會出現數據丟失問題 relu = F.ReLU()
(4)LakyReLU函數:解決了數據丟失問題 leakyrelu = F.LakyReLU()
(5)softmax函數:可用來做分類 softmax = F.softmax()
4.3.3.3損失函數組件
定義:損失函數是用來量化預測值與真實值之間的差異。
常用的損失函數主要分為兩大類:import torch.nn as nn
(1)回歸
均方誤差損失MSE Loss:Loss = nn.MSELoss()
平均絕對誤差損失 L1 Loss:Loss = nn.L1Loss()
(2)分類
交叉熵損失:Loss = nn.CrossEntropyLoss()---多分類
二元交叉熵損失:Loss = nn.BCEWithLogitsLoss()---二分類
4.3.3.4優化器
定義:是用于更新模型參數以最小化損失函數的核心工具。常常定義在損失criterion后。
常用的優化器:
SGD(隨機梯度下降)
Adagrad(自適應梯度)
RMSprop(均方根傳播)
Adam(自適應矩估計)
核心方法:
梯度清零:zero_grad()
參數更新:step()
? ? ? ? 4.3.4創建全連接神經網絡
我們以求函數的參數為例,介紹全連接神經網絡如何解決參數問題。
已知? ?x = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float)
y = torch.tensor([3, 5, 7, 9, 11], dtype=torch.float)
兩個初始數據,現在我們要寫一個線性回歸函數,求參數解。
步驟:
(1)數據輸入;
(2)調用模型;
(3)定義學習率,批次,損失,優化器
(4)循環:前向傳播、損失函數、優化器梯度清理、反向傳播、優化器參數更新
(5)打印結果
代碼示例;
import torch
from torch import nn,optim
#基本數據輸入
x = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float).view(5,1)
y = torch.tensor([3, 5, 7, 9, 11], dtype=torch.float).view(5,1)
#調用模型
model = nn.Linear(1,1)
#定義lr,epochs,criterion,optimizer
lr = 0.02
epochs = 300
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(),lr=lr)
#循環,前向傳播、Loss、梯度清零、反向傳播、梯度更新
for epoch in range(epochs):y_pred = model(x)Loss = criterion(y,y_pred)optimizer.zero_grad()Loss.backward()optimizer.step()
#打印結果
print('權重為',model.weight,'偏置為',model.bias)
結果:
權重為 Parameter containing:
tensor([[2.0241]], requires_grad=True) 偏置為 Parameter containing:
tensor([0.9129], requires_grad=True)
五、小結
? ? ? ? 本節內容我們大致對神經元有了一些基礎了解,以及全連接神經網絡的基本認識和基本操作。尤其是基本組件的部分,這個部分很重要,要清楚創建全連接網絡的基本步驟,后續創建奠定基礎。