pytorch使用交叉熵訓練模型學習筆記

阿坦發表於2024-06-17

python程式碼:

pytorch使用交叉熵訓練模型學習筆記
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()}')
View Code

執行結果

此程式碼輸入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.Modulenn.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 是每批資料的樣本數量:

  1. 輸入資料 x 透過全連線層 self.fc
  2. 全連線層計算輸出 y = xW^T + b,輸出是一個大小為 [batch_size, 2] 的張量,其中每行是一個樣本在兩個類別上的分數。

相關文章