Pytorch+PyG實(shí)現(xiàn)GraphConv過程示例詳解
GraphConv簡介
GraphConv是一種使用圖形數(shù)據(jù)的卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)模型。與傳統(tǒng)的CNN僅能處理圖片二維數(shù)據(jù)不同,GraphConv可以對(duì)任意結(jié)構(gòu)的圖進(jìn)行卷積操作,并適用于基于圖的多項(xiàng)任務(wù)。
實(shí)現(xiàn)步驟
數(shù)據(jù)準(zhǔn)備
在本實(shí)驗(yàn)中,我們使用了一個(gè)包含4萬個(gè)圖像的數(shù)據(jù)集CIFAR-10,作為示例。與其它標(biāo)準(zhǔn)圖像數(shù)據(jù)集不同的是,在這個(gè)數(shù)據(jù)集中圖形的構(gòu)成量非常大,而且各圖之間結(jié)構(gòu)差異很大,因此需要進(jìn)行大量的預(yù)處理工作。
# 導(dǎo)入cifar-10數(shù)據(jù)集 from torch_geometric.datasets import Planetoid # 加載數(shù)據(jù)、劃分訓(xùn)練集和測試集 dataset = Planetoid(root='./cifar10', name='Cora') data = dataset[0] # 定義超級(jí)參數(shù) num_features = dataset.num_features num_classes = dataset.num_classes # 構(gòu)建訓(xùn)練集和測試集索引文件 train_mask = torch.zeros(data.num_nodes, dtype=torch.uint8) train_mask[:800] = 1 test_mask = torch.zeros(data.num_nodes, dtype=torch.uint8) test_mask[800:] = 1 # 創(chuàng)建數(shù)據(jù)加載器 train_loader = DataLoader(data[train_mask], batch_size=32, shuffle=True) test_loader = DataLoader(data[test_mask], batch_size=32, shuffle=False)
通過上述代碼,我們先是導(dǎo)入CIFAR-10數(shù)據(jù)集并將其分割為訓(xùn)練及測試兩個(gè)數(shù)據(jù)集,并創(chuàng)建了相應(yīng)的數(shù)據(jù)加載器以便于對(duì)數(shù)據(jù)進(jìn)行有效處理。
實(shí)現(xiàn)模型
在定義GraphConv模型時(shí),我們需要根據(jù)圖像經(jīng)常使用的架構(gòu)定義網(wǎng)絡(luò)結(jié)構(gòu)。同時(shí),在實(shí)現(xiàn)卷積操作時(shí)應(yīng)引入鄰接矩陣(adjacency matrix)和特征矩陣(feature matrix)作為輸入,來使得網(wǎng)絡(luò)能夠?qū)W習(xí)到節(jié)點(diǎn)之間的關(guān)系和提取重要特征。
from torch.nn import Linear, ModuleList, ReLU from torch_geometric.nn import GCNConv class GraphConv(torch.nn.Module): def __init__(self, dataset): super(GraphConv, self).__init__() # 定義基礎(chǔ)參數(shù) self.input_dim = dataset.num_features self.output_dim = dataset.num_classes # 定義GCN網(wǎng)絡(luò)結(jié)構(gòu) self.convs = ModuleList() self.convs.append(GCNConv(self.input_dim, 16)) self.convs.append(GCNConv(16, 32)) self.convs.append(GCNConv(32, self.output_dim)) def forward(self, x, edge_index): for conv in self.convs: x = conv(x, edge_index) x = F.relu(x) return F.log_softmax(x, dim=1)
在上述代碼中,我們實(shí)現(xiàn)了基于GraphConv的模型的各個(gè)卷積層,并使用GCNConv
將鄰接矩陣和特征矩陣作為輸入進(jìn)行特征提取。最后結(jié)合全連接層輸出一個(gè)維度為類別數(shù)的向量,并通過softmax函數(shù)來計(jì)算損失。
模型訓(xùn)練
在定義好GraphConv網(wǎng)絡(luò)結(jié)構(gòu)之后,我們還需要指定合適的優(yōu)化器、損失函數(shù),并控制訓(xùn)練輪數(shù)、批大小與學(xué)習(xí)率等超參數(shù)。同時(shí)也需要記錄大量日志信息,方便后期跟蹤及管理。
# 定義訓(xùn)練計(jì)劃,包括損失函數(shù)、優(yōu)化器及迭代次數(shù)等 train_epochs = 200 learning_rate = 0.01 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(graph_conv.parameters(), lr=learning_rate) losses_per_epoch = [] accuracies_per_epoch = [] for epoch in range(train_epochs): running_loss = 0.0 running_corrects = 0.0 count = 0.0 for samples in train_loader: optimizer.zero_grad() x, edge_index = samples.x, samples.edge_index out = graph_conv(x, edge_index) label = samples.y loss = criterion(out, label) loss.backward() optimizer.step() running_loss += loss.item() / len(train_loader.dataset) pred = out.argmax(dim=1) running_corrects += pred.eq(label).sum().item() / len(train_loader.dataset) count += 1 losses_per_epoch.append(running_loss) accuracies_per_epoch.append(running_corrects) if (epoch + 1) % 20 == 0: print("Train Epoch {}/{} Loss {:.4f} Accuracy {:.4f}".format( epoch + 1, train_epochs, running_loss, running_corrects))
在訓(xùn)練過程中,我們遍歷每個(gè)batch,通過反向傳播算法進(jìn)行優(yōu)化,并更新loss及accuracy輸出。同時(shí),為了方便可視化與記錄,需要將訓(xùn)練過程中的loss和accuracy輸出到相應(yīng)的容器中,以便后期進(jìn)行分析和處理。
以上就是Pytorch+PyG實(shí)現(xiàn)GraphConv過程示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Pytorch PyG實(shí)現(xiàn)GraphConv的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pycharm的Available Packages為空的解決方法
這篇文章主要介紹了Pycharm的Available Packages為空的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python對(duì)list列表結(jié)構(gòu)中的值進(jìn)行去重的方法總結(jié)
這篇文章主要介紹了Python對(duì)列表list中的值進(jìn)行去重的方法總結(jié),文中給出的方法都能保持去重后的順序不發(fā)生改變,需要的朋友可以參考下2016-05-05使用Python對(duì)零售商品進(jìn)行數(shù)據(jù)分析
這篇文章主要為大家介紹了使用Python對(duì)零售商品進(jìn)行數(shù)據(jù)分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05使用Python搭建服務(wù)器公網(wǎng)展示本地電腦文件的操作過程
這篇文章主要介紹了使用Python搭建服務(wù)器公網(wǎng)展示本地電腦文件,今天我們就嘗試用python,建立一個(gè)簡單的http服務(wù)器,用來展示本地電腦上指定的目錄和文件,需要的朋友可以參考下2023-08-08Python Sanic框架實(shí)現(xiàn)文件上傳功能
Sanic是一個(gè)Python 3.5+的異步Web框架,它的設(shè)計(jì)理念與Flask相似,但采用了更高效的異步I/O處理,在處理文件上傳時(shí),Sanic同樣提供了方便、高效的方法,本教程將結(jié)合實(shí)際案例,詳細(xì)介紹如何在Sanic框架中實(shí)現(xiàn)文件上傳的功能,需要的朋友可以參考下2024-08-08python pprint模塊中print()和pprint()兩者的區(qū)別
這篇文章主要介紹了python pprint模塊中print()和pprint()兩者的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02