Pytorch結(jié)合PyG實(shí)現(xiàn)MLP過程詳解
導(dǎo)入庫和數(shù)據(jù)
首先,我們需要導(dǎo)入PyTorch和PyG庫,然后準(zhǔn)備好我們的數(shù)據(jù)。例如,我們可以使用以下方式生成一個(gè)簡(jiǎn)單的隨機(jī)數(shù)據(jù)集:
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提供的圖形數(shù)據(jù)集之一。這里我們選擇了 ENZYMES
數(shù)據(jù)集并存儲(chǔ)到 /tmp/ENZYMES
文件夾中。然后我們將該數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集,其中訓(xùn)練集包含所有數(shù)據(jù)減去最后1000個(gè)數(shù)據(jù),測(cè)試集則為最后1000個(gè)數(shù)據(jù)。
定義模型結(jié)構(gòu)
接下來,我們需要定義MLP模型的結(jié)構(gòu)。通過PyTorch和PyG,我們可以自己定義完整的MLP模型或者利用現(xiàn)有的庫函數(shù)快速構(gòu)建模型。在這里,我們將使用 torch.nn.Sequential
函數(shù)逐層堆疊多個(gè)線性層來實(shí)現(xiàn)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)
上述代碼中,我們定義了一個(gè) Net
類用于構(gòu)建MLP網(wǎng)絡(luò),接收輸入通道數(shù)、隱藏層節(jié)點(diǎn)數(shù)、輸出通道數(shù)以及MLP層數(shù)作為參數(shù)。例如,我們可以按照以下方式創(chuàng)建一個(gè)擁有 4 層、128 個(gè)隱藏節(jié)點(diǎn)、并將度為圖結(jié)構(gòu)作為輸入的MLP模型:
model = Net(in_channels=dataset.num_node_features, hidden_channels=128, out_channels=dataset.num_classes, num_layers=4)
定義訓(xùn)練函數(shù)
然后,我們需要定義訓(xùn)練函數(shù)來訓(xùn)練我們的MLP神經(jīng)網(wǎng)絡(luò)。在這里,我們將使用交叉熵?fù)p失和Adam優(yōu)化器進(jìn)行訓(xùn)練,并在每一個(gè)epoch結(jié)束時(shí)計(jì)算準(zhǔn)確率并打印出來。以下是訓(xùn)練函數(shù)的示例代碼:
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)
在上述代碼中,我們遍歷加載器中的每個(gè)數(shù)據(jù)批次,并對(duì)模型進(jìn)行培訓(xùn)。對(duì)于每個(gè)圖數(shù)據(jù)批次,我們計(jì)算網(wǎng)絡(luò)輸出、預(yù)測(cè)和損失,然后通過反向傳播來更新權(quán)重。最后,我們將總損失和正確率記錄下來并返回。
定義測(cè)試函數(shù)
接下來,我們還需要定義測(cè)試函數(shù)來測(cè)試我們的MLP神經(jīng)網(wǎng)絡(luò)性能表現(xiàn)。我們將利用與訓(xùn)練函數(shù)相同的輸出參數(shù)進(jìn)行測(cè)試,并打印出最終的測(cè)試準(zhǔn)確率。以下是測(cè)試函數(shù)的示例代碼:
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)
在上述代碼中,我們對(duì)測(cè)試數(shù)據(jù)集中的所有數(shù)據(jù)進(jìn)行了循環(huán),并計(jì)算網(wǎng)絡(luò)的輸出和預(yù)測(cè)。我們記錄下總損失和正確分類的數(shù)據(jù)量,并返回?fù)p失和準(zhǔn)確率之間的比率(我們使用該比率而不是精度來反映測(cè)試表現(xiàn)通常較?。?/p>
訓(xùn)練模型并評(píng)估訓(xùn)練結(jié)果
最后,我們可以使用前面定義過的函數(shù)來定義主函數(shù),從而完成MLP神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和測(cè)試。以下是主函數(shù)的示例代碼:
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神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和測(cè)試。我們使用 DataLoader
函數(shù)進(jìn)行數(shù)據(jù)加載,設(shè)置學(xué)習(xí)率、損失函數(shù)、訓(xùn)練輪數(shù)等超參數(shù)。最后,我們可以在屏幕上看到每個(gè)時(shí)代的準(zhǔn)確率和損失值,并通過它們?cè)u(píng)估模型的訓(xùn)練表現(xiàn)。
以上就是Pytorch結(jié)合PyG實(shí)現(xiàn)MLP過程詳解的詳細(xì)內(nèi)容,更多關(guān)于Pytorch PyG實(shí)現(xiàn)MLP的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 實(shí)現(xiàn)一行輸入多個(gè)數(shù)字(用空格隔開)
這篇文章主要介紹了Python 實(shí)現(xiàn)一行輸入多個(gè)數(shù)字,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04tensorflow基于Anaconda環(huán)境搭建的方法步驟
本文主要介紹了tensorflow基于Anaconda環(huán)境搭建的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02keras的ImageDataGenerator和flow()的用法說明
這篇文章主要介紹了keras的ImageDataGenerator和flow()的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07Python如何將list中的string轉(zhuǎn)換為int
這篇文章主要介紹了Python如何將list中的string轉(zhuǎn)換為int,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python中創(chuàng)建對(duì)象列表的實(shí)現(xiàn)示例
本文主要介紹了Python中創(chuàng)建對(duì)象列表的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python中單例常用的幾種實(shí)現(xiàn)方法總結(jié)
Python 的模塊就是天然的單例模式,下面這篇文章主要給大家介紹了關(guān)于python中單例常用的幾種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python單例具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起來看看吧2018-10-10詳解Selenium+PhantomJS+python簡(jiǎn)單實(shí)現(xiàn)爬蟲的功能
這篇文章主要介紹了詳解Selenium+PhantomJS+python簡(jiǎn)單實(shí)現(xiàn)爬蟲的功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07