目錄
多層感知機:
介紹:
代碼實現:
運行結果:
問題答疑:
線性變換與非線性變換
參數含義
為什么清除梯度?
反向傳播的作用
為什么更新權重?
多層感知機:
介紹:
縮寫:MLP,這是一種人工神經網絡,由一個輸入層、一個或多個隱藏層以及一個輸出層組成,每一層都由多個節點(神經元)構成。在MLP中,節點之間只有前向連接,沒有循環連接,這使得它屬于前饋神經網絡的一種。每個節點都應用一個激活函數,如sigmoid、ReLU等,以引入非線性,從而使網絡能夠擬合復雜的函數和數據分布。
代碼實現:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# Step 1: Define the MLP model
class SimpleMLP(nn.Module):def __init__(self):super(SimpleMLP, self).__init__()self.fc1 = nn.Linear(784, 128) # Input layer to hidden layerself.fc2 = nn.Linear(128, 64) # Hidden layer to another hidden layerself.fc3 = nn.Linear(64, 10) # Hidden layer to output layerself.relu = nn.ReLU()def forward(self, x):x = x.view(-1, 784) # Flatten the input from 28x28 to 784x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return x# Step 2: Load MNIST dataset
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)# Step 3: Define loss function and optimizer
model = SimpleMLP()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# Step 4: Train the model
num_epochs = 5
for epoch in range(num_epochs):for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.item()))# Step 5: Evaluate the model on the test set (optional)
with torch.no_grad():correct = 0total = 0for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total))
運行結果:
問題答疑:
線性變換與非線性變換
在神經網絡中
線性變換通常指的是權重矩陣和輸入數據的矩陣乘法,再加上偏置向量。數學上,對于一個輸入向量𝑥x和權重矩陣𝑊W,加上偏置向量𝑏b,線性變換可以表示為: 𝑧=𝑊𝑥+𝑏z=Wx+b
非線性變換是指在神經網絡的每一層之后應用的激活函數,如ReLU、sigmoid或tanh等。這些函數引入了非線性,使神經網絡能夠學習和表達復雜的函數關系。沒有非線性變換,無論多少層的神經網絡最終都將簡化為一個線性模型。
參數含義
在上述模型中,參數如784, 128, 64, 10并不是字節,而是神經網絡層的尺寸,具體來說是神經元的數量:
- 784: 這是輸入層的神經元數量,對應于MNIST數據集中每個圖片的像素數量。MNIST的圖片是28x28像素,因此總共有784個像素點。
- 128?和?64: 這是兩個隱藏層的神經元數量。它們代表了第一層和第二層的寬度,即這一層有多少個神經元。
- 10: 這是輸出層的神經元數量,對應于MNIST數據集中的10個數字類別(0到9)。
為什么清除梯度?
在每一次前向傳播和反向傳播過程中,梯度會被累積在張量的
.grad
屬性中。如果不手動清零,這些梯度將會被累加,導致不正確的梯度值。因此,在每次迭代開始之前,都需要調用optimizer.zero_grad()
來清空梯度。
反向傳播的作用
反向傳播(Backpropagation)是一種算法,用于計算損失函數相對于神經網絡中所有權重的梯度。它的目的是為了讓神經網絡知道,當損失函數值較高時,哪些權重需要調整,以及調整的方向和幅度。這些梯度隨后被用于權重更新,以最小化損失函數。
為什么更新權重?
權重更新是基于梯度下降算法進行的。在反向傳播計算出梯度后,權重通過
optimizer.step()
函數更新,以朝著減小損失函數的方向移動。這是訓練神經網絡的核心,即通過不斷調整權重和偏置,使模型能夠更好地擬合訓練數據,從而提高預測準確性。