GraphSAGE项目练手

python 复制代码
# 导包
from torch_geometric.datasets import Planetoid
from torch_geometric.loader import NeighborLoader
from torch_geometric.utils import to_networkx
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import torch
import torch.nn.functional as F
from torch_geometric.nn import SAGEConv
# 导入PubMed数据集
dataset = Planetoid(root='',name='Pubmed')
data = dataset[0]

# 邻居采样
# 使用NeighborLoader 来完成这一任务。
# 保留目的节点的10个邻居 和 其邻居的10个邻居, 对60个目的节点进行分组,每16个目的节点为一组

# 进行采样
train_loader = NeighborLoader(
    data,# 数据源
    num_neighbors=[5,10], # 每一层采样的邻居采样量,第一层5,第二层10
    batch_size=16,
    input_nodes=data.train_mask # 60个训练目的节点
)
# 遍历数据检验
# for i,subgraph in enumerate(train_loader):
#     print(f'Subgraph{i}:{subgraph}')

# 子图可视化
# fig = plt.figure(figsize=(16,16))
# for idx,(subdata,pos) in enumerate(zip(train_loader,[221,222,223,224])):
#     G = to_networkx(subdata,to_undirected=True)
#     ax = fig.add_subplot(pos)
#     ax.set_title(f'Subgraph{idx},fonts=24')
#     plt.axis('off')
#     nx.draw_networkx(G,pos=nx.spring_layout(G),with_labels=False,node_color=subdata.y)
# plt.show()

# 实现准确率评估模型
def  accuracy(pre_y,y):
    return ((pre_y==y).sum() / len(y)).item()

# 定义GraphSAGE
class GraphSAGE(torch.nn.Module):
    def __init__(self,dim_in,dim_h,dim_out):
        super().__init__()
        self.sage1 = SAGEConv(dim_in,dim_h)
        self.sage2= SAGEConv(dim_h,dim_out)

    def forward(self,x,edge_index):
        h = self.sage1(x,edge_index)
        h = torch.relu(h)
        h = F.dropout(h,p=0.5,training=self.training)
        h = self.sage2(h,edge_index)
        return h
# 使用小批量训练,Fit函数要修改为先循环epoch次,然后循环批数据,以在每个批数据上训练epoch次
    def fit(self,loader,epochs):
        criterion = torch.nn.CrossEntropyLoss()
        optimizer = torch.optim.Adam(self.parameters(),lr=0.01)
        self.train()
        for epoch in range(epochs+1):
            total_loss = 0
            acc = 0
            val_loss = 0
            val_acc = 0
            for batch in loader:
                optimizer.zero_grad()
                out = self(batch.x, batch.edge_index)
                loss = criterion(out[batch.train_mask], batch.y[batch.train_mask])
                total_loss += loss.item()
                acc += accuracy(out[batch.train_mask].argmax(dim=1), batch.y[batch.train_mask])
                loss.backward()
                optimizer.step()

                # Validation
                val_loss += criterion(out[batch.val_mask], batch.y[batch.val_mask])
                val_acc += accuracy(out[batch.val_mask].argmax(dim=1), batch.y[batch.val_mask])

                if epoch % 20 == 0:
                    print(f'Epoch {epoch:>3} | Train Loss: {loss/len(loader):.3f} | Train Acc: {acc/len(loader)*100:>6.2f}% | Val Loss: {val_loss/len(train_loader):.2f} | Val Acc: {val_acc/len(train_loader)*100:.2f}%')
@torch.no_grad()
def test(self, data):
    self.eval()
    out = self(data.x, data.edge_index)
    acc = accuracy(out.argmax(dim=1)[data.test_mask], data.y[data.test_mask])
    return acc

# Create GraphSAGE
graphsage = GraphSAGE(dataset.num_features, 64, dataset.num_classes)
print(graphsage)

# Train
graphsage.fit(train_loader, 200)
相关推荐
_.Switch10 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
XiaoLiuLB29 分钟前
ChatGPT Canvas:交互式对话编辑器
人工智能·自然语言处理·chatgpt·编辑器·aigc
Hoper.J29 分钟前
PyTorch 模型保存与加载的三种常用方式
人工智能·pytorch·python
菜就多练_082832 分钟前
《深度学习》OpenCV 摄像头OCR 过程及案例解析
人工智能·深度学习·opencv·ocr
达柳斯·绍达华·宁1 小时前
CNN中的平移不变性和平移等变性
人工智能·神经网络·cnn
弱冠少年1 小时前
websockets库使用(基于Python)
开发语言·python·numpy
没有余地 EliasJie1 小时前
Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT
pytorch·windows·深度学习·ubuntu·pycharm·conda·tensorflow
技术无疆2 小时前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
xuehaishijue2 小时前
红外画面空中目标检测系统源码分享
人工智能·目标检测·计算机视觉
羊小猪~~2 小时前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库