python程式碼:
import torch import torch.nn as nn import torch.optim as optim # 定義一個簡單的神經網路模型 class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc = nn.Linear(3, 2) # 輸入3維,輸出2類 def forward(self, x): return self.fc(x) # 建立模型例項 model = SimpleModel() # 建立損失函式 criterion = nn.CrossEntropyLoss() # 建立最佳化器 optimizer = optim.SGD(model.parameters(), lr=0.01) # 定義固定的訓練資料 inputs = torch.tensor([ [0.3, 0.2, 0.1], [0.4, 0.5, 0.6], [9, 8, 7], [10, 11, 102], [3, 2, 1], [4, 5, 6], [9, 8, 7], [1.0, 1.1, 102], [0.3, 0.2, 0.1], [0.4, 0.5, 0.6], ], dtype=torch.float32) # 10個樣本,每個樣本3維 targets = torch.tensor([0, 1, 0, 1, 0, 1, 0, 1, 0, 1], dtype=torch.long) # 真實標籤 # 訓練模型1000次 num_epochs = 1000 for epoch in range(num_epochs): # 前向傳播 outputs = model(inputs) # 計算損失 loss = criterion(outputs, targets) # 反向傳播和最佳化 optimizer.zero_grad() loss.backward() optimizer.step() # 列印損失值 if (epoch + 1) % 100 == 0: # 每100次列印一次損失值 print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}') print('Training complete.') # 定義一個待測試的樣本 test_sample = torch.tensor([0.5, 5, 500], dtype=torch.float32) # 預測結果 with torch.no_grad(): # 在測試時不需要計算梯度 test_output = model(test_sample) probabilities = torch.softmax(test_output, dim=0) predicted_class = torch.argmax(test_output).item() print(f'Test Sample Prediction: Class {predicted_class}') print(f'Probabilities: {probabilities.tolist()}')
執行結果
此程式碼輸入10個樣本,每個樣本3個特徵,輸出2個類別(升序特徵為1,降序特徵為0)
下面詳細講解一下 SimpleModel
這個模型的定義和構造
SimpleModel
模型定義
class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc = nn.Linear(3, 2) # 輸入3維,輸出2類 def forward(self, x): return self.fc(x)
1.類定義:
class SimpleModel(nn.Module):
這行程式碼定義了一個名為 SimpleModel
的類,該類繼承自 nn.Module
。nn.Module
是 PyTorch 中所有神經網路模組的基類。透過繼承 nn.Module
,我們可以利用 PyTorch 提供的許多有用的功能,例如引數管理和自動求導。
2.初始化方法:
def __init__(self): super(SimpleModel, self).__init__() self.fc = nn.Linear(3, 2) # 輸入3維,輸出2類
__init__
方法是類的建構函式,當建立SimpleModel
類的例項時會被呼叫。super(SimpleModel, self).__init__()
呼叫父類(即nn.Module
)的建構函式,初始化父類中的一些屬性self.fc = nn.Linear(3, 2)
建立一個全連線層(也叫線性層),輸入維度為3,輸出維度為2。nn.Linear
是 PyTorch 中定義全連線層的類。它接受兩個引數:輸入特徵數和輸出特徵數。這裡輸入特徵數是3,輸出特徵數是2。
3.前向傳播方法:
def forward(self, x): return self.fc(x)
forward
方法定義了模型的前向傳播過程,即當輸入資料x
傳遞給模型時,資料如何透過各層計算最終輸出。self.fc(x)
將輸入x
傳遞給全連線層self.fc
,並返回輸出
模型的具體構造
1. 全連線層(Linear Layer):
- 定義:全連線層是指每個輸入節點都與輸出節點相連,進行線性變換。它的數學表示是:
y = xW^T + b
,其中W
是權重矩陣,b
是偏置向量。 - 輸入和輸出:在這個模型中,全連線層的輸入維度是3,輸出維度是2。這意味著輸入資料應該有3個特徵,輸出將是2個類別的分數。
2. 模型的引數:
- 權重矩陣:大小為
[2, 3]
,表示從3維輸入到2維輸出的連線權重。 - 偏置向量:大小為
[2]
,每個輸出類別一個偏置。
資料流動
假設輸入資料 x
是一個大小為 [batch_size, 3]
的張量,其中 batch_size
是每批資料的樣本數量:
- 輸入資料
x
透過全連線層self.fc
。 - 全連線層計算輸出
y = xW^T + b
,輸出是一個大小為[batch_size, 2]
的張量,其中每行是一個樣本在兩個類別上的分數。