藉助於pytorch的GNN網絡解決鳶尾花分類問題

from sklearn.datasets import load_iris
import torch
from torch_geometric.data import Data
import networkx as nx
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
data = load_iris()
y = data.target
x = data.data
G = nx.Graph()
num = 100
nodes = list(range(num))  # [0,1,2,3,4,5]
G.add_nodes_from(nodes)  # 從列表中加點
edges = []  # 存放所有的邊,構成無向圖(去掉最後一個結點,構成一個環)
for idx in range(num):
    for idy in range(num):
        edges.append((idx, idy))

#  將所有邊加入網絡
G.add_edges_from(edges)

print(G.nodes())
print(G.edges())
edges_graph = [list(i) for i in G.edges()]
edge_index = torch.tensor(edges_graph, dtype=torch.long)
x1 = torch.tensor(x[0:100, :], dtype=torch.float)

data = Data(x=x1, edge_index=edge_index.t().contiguous(), y=torch.tensor(y[0:100], dtype=torch.long))

print(data)


class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = GCNConv(4, 16)
        self.conv2 = GCNConv(16, 3)

    def forward(self, data):
        x, edge_index = data.x, data.edge_index

        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = self.conv2(x, edge_index)

        return F.softmax(x, dim=1)




model = Net()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

model.train()
for epoch in range(200):
    optimizer.zero_grad()
    out = model(data)
    loss = F.cross_entropy(out, data.y)
    loss.backward()
    optimizer.step()
    print(loss.data)
發佈了53 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章