一、多層感知機的定義
????????多層感知機就是全連接層神經網絡,如圖1所示,其中隱含層可以有多層
?圖1. 多層感知機結構(隱含層與輸出層之間為全連接,圖中少了幾根連接線)
??????? “層”定義為輸入權重(weight)與偏差(bias)的組合,如圖2所示。
?圖2. “層”的定義
二、運行原理
2.1 數據輸入
Input層輸入向量,為每個輸入層節(jié)點的數值,即,如圖3所示。
?圖3. 多層感知機數據的輸入(圖中以輸入層3個神經元,一個4神經元的隱含層,兩個輸出神經元為例,可包含多個隱含層,每層神經元個數不固定)
2.2 從輸入層前向傳播到隱含層
先看隱含層單個神經元的數據傳輸情況,如圖4所示,每根連線都有一個權重(weight,),隱含層每個神經元都有一個偏置(bias,),sigmoid為激活函數,此時有
?圖4. 單個神經元數據傳輸情況
同理有
將隱含層數值拼成列向量有:
文章來源:http://www.zghlxwxcb.cn/news/detail-658879.html
隱含層傳播到下一隱含層,隱含層傳播到輸出層同理。文章來源地址http://www.zghlxwxcb.cn/news/detail-658879.html
三、多層感知機的代碼實現
3.1 從零開始實現
import torch
from torch import nn
from d2l import torch as d2l
# 一個batch更新一次參數,例如訓練集有100個數據
# batch_size = 10,則遍歷訓練集更新10次參數,訓練集完整跑一遍稱為一個 epoch
batch_size = 256
# 下載數據集
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
# 輸入層神經元數,輸出層神經元數,第一層隱含層神經元數
num_inputs, num_outputs, num_hiddens = 784, 10, 256
# 從輸入層到第一隱含層的權重矩陣
W1 = nn.Parameter(torch.randn(
num_inputs, num_hiddens, requires_grad=True) * 0.01)
# 第一隱含層的 bias 矩陣
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
# 從第一隱含層到輸出層的權重矩陣
W2 = nn.Parameter(torch.randn(
num_hiddens, num_outputs, requires_grad=True) * 0.01)
# 輸出層的bias矩陣
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
# 所有需要更新的參數
params = [W1, b1, W2, b2]
# 激活函數
def relu(X):
a = torch.zeros_like(X)
return torch.max(X, a)
# 網絡
def net(X):
# 將輸入整理成列向量
X = X.reshape((-1, num_inputs))
# 從輸入層到隱含層的計算過程
H = relu(X@W1 + b1) # 這里“@”代表矩陣乘法
# 返回從隱含層到輸出層的計算結果
return (H@W2 + b2)
# 損失函數
loss = nn.CrossEntropyLoss(reduction='none')
# epoch 數和學習率
num_epochs, lr = 10, 0.1
# 優(yōu)化器,即如何訓練,這里使用SGD訓練
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
3.2 簡潔實現
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10))
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
到了這里,關于李沐pytorch學習-多層感知機及其實現的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!