您好,登錄后才能下訂單哦!
這篇“Pytorch結合PyG實現MLP的方法是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Pytorch結合PyG實現MLP的方法是什么”文章吧。
首先,我們需要導入PyTorch和PyG庫,然后準備好我們的數據。例如,我們可以使用以下方式生成一個簡單的隨機數據集:
from torch.utils.data import random_split from torch_geometric.datasets import TUDataset dataset = TUDataset(root='/tmp/ENZYMES', name='ENZYMES') train_dataset, test_dataset = random_split(dataset, [len(dataset) - 1000, 1000])
其中,TUDataset
是PyG提供的圖形數據集之一。這里我們選擇了 ENZYMES
數據集并存儲到 /tmp/ENZYMES
文件夾中。然后我們將該數據集分成訓練集和測試集,其中訓練集包含所有數據減去最后1000個數據,測試集則為最后1000個數據。
接下來,我們需要定義MLP模型的結構。通過PyTorch和PyG,我們可以自己定義完整的MLP模型或者利用現有的庫函數快速構建模型。在這里,我們將使用 torch.nn.Sequential
函數逐層堆疊多個線性層來實現MLP模型。以下是MLP模型定義的示例代碼:
import torch.nn as nn from torch_geometric.nn import MLP class Net(nn.Module): def __init__(self, in_channels, hidden_channels, out_channels, num_layers=3): super(Net, self).__init__() self.num_layers = num_layers self.mlp = MLP([in_channels] + [hidden_channels] * (num_layers-1) + [out_channels]) def forward(self, x): return self.mlp(x)
上述代碼中,我們定義了一個 Net
類用于構建MLP網絡,接收輸入通道數、隱藏層節點數、輸出通道數以及MLP層數作為參數。例如,我們可以按照以下方式創建一個擁有 4 層、128 個隱藏節點、并將度為圖結構作為輸入的MLP模型:
model = Net(in_channels=dataset.num_node_features, hidden_channels=128, out_channels=dataset.num_classes, num_layers=4)
然后,我們需要定義訓練函數來訓練我們的MLP神經網絡。在這里,我們將使用交叉熵損失和Adam優化器進行訓練,并在每一個epoch結束時計算準確率并打印出來。以下是訓練函數的示例代碼:
import torch.optim as optim from torch_geometric.data import DataLoader from tqdm import tqdm def train(model, loader, optimizer, loss_fn): model.train() correct = 0 total_loss = 0 for data in tqdm(loader, desc='Training'): optimizer.zero_grad() out = model(data.x) pred = out.argmax(dim=1) loss = loss_fn(out, data.y) loss.backward() optimizer.step() total_loss += loss.item() * data.num_graphs correct += pred.eq(data.y).sum().item() return total_loss / len(loader.dataset), correct / len(loader.dataset)
在上述代碼中,我們遍歷加載器中的每個數據批次,并對模型進行培訓。對于每個圖數據批次,我們計算網絡輸出、預測和損失,然后通過反向傳播來更新權重。最后,我們將總損失和正確率記錄下來并返回。
接下來,我們還需要定義測試函數來測試我們的MLP神經網絡性能表現。我們將利用與訓練函數相同的輸出參數進行測試,并打印出最終的測試準確率。以下是測試函數的示例代碼:
def test(model, loader, loss_fn): model.eval() correct = 0 total_loss = 0 with torch.no_grad(): for data in tqdm(loader, desc='Testing'): out = model(data.x) pred = out.argmax(dim=1) loss = loss_fn(out, data.y) total_loss += loss.item() * data.num_graphs correct += pred.eq(data.y).sum().item() return total_loss / len(loader.dataset), correct / len(loader.dataset)
在上述代碼中,我們對測試數據集中的所有數據進行了循環,并計算網絡的輸出和預測。我們記錄下總損失和正確分類的數據量,并返回損失和準確率之間的比率(我們使用該比率而不是精度來反映測試表現通常較小)。
最后,我們可以使用前面定義過的函數來定義主函數,從而完成MLP神經網絡的訓練和測試。以下是主函數的示例代碼:
if __name__ == '__main__': device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = Net(in_channels=dataset.num_node_features, hidden_channels=128, out_channels=dataset.num_classes, num_layers=4).to(device) loader = DataLoader(train_dataset, batch_size=128, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=128) optimizer = optim.Adam(model.parameters(), lr=0.01) loss_fn = nn.CrossEntropyLoss() for epoch in range(1, 201): train_loss, train_acc = train(model, loader, optimizer, loss_fn) test_loss, test_acc = test(model, test_loader, loss_fn) print(f'Epoch {epoch:03d}, Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.4f}, ' f'Test Loss: {test_loss:.4f}, Test Acc: {test_acc:.4f}')
通過上述代碼,我們就可以完成MLP神經網絡的訓練和測試。我們使用 DataLoader
函數進行數據加載,設置學習率、損失函數、訓練輪數等超參數。最后,我們可以在屏幕上看到每個時代的準確率和損失值,并通過它們評估模型的訓練表現。
以上就是關于“Pytorch結合PyG實現MLP的方法是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。