亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pytorch+PyG實現GIN的方法是什么

發布時間:2023-04-21 17:09:10 來源:億速云 閱讀:140 作者:iii 欄目:開發技術

本篇內容介紹了“Pytorch+PyG實現GIN的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

GIN簡介

GIN(Graph Isomorphism Network)是一類基于圖同構的神經網絡。在傳統的神經網絡中,每個節點的特征只依賴于其自身特征,但在圖數據中,節點的特征還與其鄰居節點有關系。GIN網絡通過定義可重復均值池化運算來學習節點及其鄰居的特征表示,并使用多層感知器(MLP)作為逐層轉換函數進行特征提取。

實現步驟

數據準備

這里我們仍然選用Cora數據集作為示例數據。由于GIN采用基于點、簡單且無參數的鄰域聚合方式,因此不需要額外對數據做處理,直接使用即可。

import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.utils import from_networkx, to_networkx
# 加載Cora數據集
dataset = Planetoid(root='./cora', name='Cora')
data = dataset[0]
# 將nx.Graph形式的圖轉換成PyG需要的格式
graph = to_networkx(data)
data = from_networkx(graph)
# 獲取節點數量和特征向量維度
num_nodes = data.num_nodes
num_features = dataset.num_features
num_classes = dataset.num_classes
# 建立需要訓練的節點分割數據集
data.train_mask = torch.zeros(num_nodes, dtype=torch.bool)
data.val_mask = torch.zeros(num_nodes, dtype=torch.bool)
data.test_mask = torch.zeros(num_nodes, dtype=torch.bool)
data.train_mask[:num_nodes - 1000] = True
data.test_mask[-1000:] = True
data.val_mask[num_nodes - 2000: num_nodes - 1000] = True

實現模型

接下來,我們需要定義GIN模型。

from torch_geometric.nn import global_mean_pool
class GIN(torch.nn.Module):
    def __init__(self, hidden_dim, num_layers):
        super(GIN, self).__init__()
        self.conv1 = GINConv(mlp=nn.Sequential(nn.Linear(num_features, hidden_dim),
                                                nn.ReLU(),
                                                nn.Linear(hidden_dim, hidden_dim)))
        self.convs = nn.ModuleList()
        for _ in range(num_layers - 1):
            self.convs.append(GINConv(mlp=nn.Sequential(nn.Linear(hidden_dim, hidden_dim),
                                                        nn.ReLU(),
                                                        nn.Linear(hidden_dim, hidden_dim))))
        self.classify = nn.Sequential(nn.Linear(hidden_dim, num_classes))
    def forward(self, data):
        x, edge_index, batch = data.x, data.edge_index, data.batch
        x = F.relu(self.conv1(x, edge_index))
        for conv in self.convs:
            x = F.relu(conv(x, edge_index))
        out = global_mean_pool(x, batch)
        return self.classify(out)

在上述代碼中,我們實現了多層GIN的“可重復均值池化”結構,并使用MLP作為轉換函數進行多層特征提取。

模型訓練

定義好模型后,可以開始針對Cora數據集進行模型訓練了。訓練模型前先設置好優化器和損失函數,并指定訓練周期及其過程中需要記錄輸出信息的參數。

from torch_geometric.nn import GINConv, global_add_pool
# 初始化GIN并指定參數
num_layers = 5
hidden_dim = 1024
model = GIN(hidden_dim=hidden_dim, num_layers=num_layers).to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-06)
loss_func = nn.CrossEntropyLoss()
# 開始訓練
for epoch in range(100):
    model.train()
    optimizer.zero_grad()
    pred = model(train_data)
    loss = loss_func(pred[train_mask], train_labels)
    loss.backward()
    optimizer.step()
    # 在各個測試階段檢測一下準確率
    with torch.no_grad():
        model.eval()
        pred = model(test_data)
        test_loss = loss_func(pred[test_mask], test_labels).item()
        pred = pred.argmax(dim=-1, keepdim=True)
        correct = float(pred[test_mask].eq(test_labels.view(-1, 1)[test_mask]).sum().item())
        acc = correct / test_mask.sum().item()
        if epoch % 10 == 0:
            print("Epoch {:03d}, Train Loss {:.4f}, Test Loss {:.4f}, Test Acc {:.4f}".format(
                epoch, loss.item(), test_loss, acc))

“Pytorch+PyG實現GIN的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉树县| 堆龙德庆县| 博爱县| 文成县| 瓦房店市| 行唐县| 泗水县| 基隆市| 徐州市| 长沙市| 灵川县| 乐昌市| 徐闻县| 蓬莱市| 东阿县| 龙海市| 安图县| 鄂托克前旗| 汝阳县| 中方县| 资兴市| 杭锦旗| 武威市| 若尔盖县| 成安县| 沙田区| 龙陵县| 秭归县| 巴林右旗| 察雅县| 玉山县| 贞丰县| 虎林市| 红安县| 赤水市| 麦盖提县| 井冈山市| 北流市| 西畴县| 湟中县| 沙湾县|