首页 > 其他分享 >1、pytorch_geometric基本使用

1、pytorch_geometric基本使用

时间:2023-09-25 19:45:39浏览次数:40  
标签:基本 index 33 32 31 pytorch edge geometric data

工具包安装方法:

   

image.png

  In [1]:
%matplotlib inline
import torch
import networkx as nx
import matplotlib.pyplot as plt


def visualize_graph(G, color):
    plt.figure(figsize=(7,7))
    plt.xticks([])
    plt.yticks([])
    nx.draw_networkx(G, pos=nx.spring_layout(G, seed=42), with_labels=False,
                     node_color=color, cmap="Set2")
    plt.show()


def visualize_embedding(h, color, epoch=None, loss=None):
    plt.figure(figsize=(7,7))
    plt.xticks([])
    plt.yticks([])
    h = h.detach().cpu().numpy()
    plt.scatter(h[:, 0], h[:, 1], s=140, c=color, cmap="Set2")
    if epoch is not None and loss is not None:
        plt.xlabel(f'Epoch: {epoch}, Loss: {loss.item():.4f}', fontsize=16)
    plt.show()
   
D:\ProgramData\Anaconda3\lib\site-packages\numpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
D:\ProgramData\Anaconda3\lib\site-packages\numpy\.libs\libopenblas.IPBC74C7KURV7CB2PKT5Z5FNR3SIBV4J.gfortran-win_amd64.dll
D:\ProgramData\Anaconda3\lib\site-packages\numpy\.libs\libopenblas.NOIJJG62EMASZI6NYURL6JBKM4EVBGM7.gfortran-win_amd64.dll
  stacklevel=1)
   

Graph Neural Networks

  • 致力于解决不规则数据结构(图像和文本相对格式都固定,但是社交网络与化学分子等格式肯定不是固定的)
  • GNN模型迭代更新主要基于图中每个节点及其邻居的信息,基本表示如下:
$$ \mathbf{x}_v^{(\ell + 1)} = f^{(\ell + 1)}_{\theta} \left( \mathbf{x}_v^{(\ell)}, \left\{ \mathbf{x}_w^{(\ell)} : w \in \mathcal{N}(v) \right\} \right) $$

节点的特征: $\mathbf{x}_v^{(\ell)}$ , $v \in \mathcal{V}$ 在图中 $\mathcal{G} = (\mathcal{V}, \mathcal{E})$ 根据其邻居信息进行更新 $\mathcal{N}(v)$:

   

数据集:Zachary's karate club network.

该图描述了一个空手道俱乐部会员的社交关系,以34名会员作为节点,如果两位会员在俱乐部之外仍保持社交关系,则在节点间增加一条边。 每个节点具有一个34维的特征向量,一共有78条边。 在收集数据的过程中,管理人员 John A 和 教练 Mr. Hi(化名)之间产生了冲突,会员们选择了站队,一半会员跟随 Mr. Hi 成立了新俱乐部,剩下一半会员找了新教练或退出了俱乐部。 image.png

   

PyTorch Geometric

  • 这个就是咱们的核心了,说白了就是这里实现了各种图神经网络中的方法
  • 咱们直接调用就可以了:PyTorch Geometric (PyG) library
   

数据集介绍

  In [2]:
from torch_geometric.datasets import KarateClub

dataset = KarateClub()
print(f'Dataset: {dataset}:')
print('======================')
print(f'Number of graphs: {len(dataset)}')
print(f'Number of features: {dataset.num_features}')
print(f'Number of classes: {dataset.num_classes}')
   
Dataset: KarateClub():
======================
Number of graphs: 1
Number of features: 34
Number of classes: 4
  In [3]:
data = dataset[0]  # Get the first graph object.

print(data)
   
Data(x=[34, 34], edge_index=[2, 156], y=[34], train_mask=[34])
   
  • 图的表示用Data格式(说明可以点击)
   

edge_index

  • edge_index:表示图的连接关系(start,end两个序列)
  • node features:每个点的特征
  • node labels:每个点的标签
  • train_mask:有的节点木有标签(用来表示哪些节点要计算损失)
  In [4]:
edge_index = data.edge_index
print(edge_index.t())
   
tensor([[ 0,  1],
        [ 0,  2],
        [ 0,  3],
        [ 0,  4],
        [ 0,  5],
        [ 0,  6],
        [ 0,  7],
        [ 0,  8],
        [ 0, 10],
        [ 0, 11],
        [ 0, 12],
        [ 0, 13],
        [ 0, 17],
        [ 0, 19],
        [ 0, 21],
        [ 0, 31],
        [ 1,  0],
        [ 1,  2],
        [ 1,  3],
        [ 1,  7],
        [ 1, 13],
        [ 1, 17],
        [ 1, 19],
        [ 1, 21],
        [ 1, 30],
        [ 2,  0],
        [ 2,  1],
        [ 2,  3],
        [ 2,  7],
        [ 2,  8],
        [ 2,  9],
        [ 2, 13],
        [ 2, 27],
        [ 2, 28],
        [ 2, 32],
        [ 3,  0],
        [ 3,  1],
        [ 3,  2],
        [ 3,  7],
        [ 3, 12],
        [ 3, 13],
        [ 4,  0],
        [ 4,  6],
        [ 4, 10],
        [ 5,  0],
        [ 5,  6],
        [ 5, 10],
        [ 5, 16],
        [ 6,  0],
        [ 6,  4],
        [ 6,  5],
        [ 6, 16],
        [ 7,  0],
        [ 7,  1],
        [ 7,  2],
        [ 7,  3],
        [ 8,  0],
        [ 8,  2],
        [ 8, 30],
        [ 8, 32],
        [ 8, 33],
        [ 9,  2],
        [ 9, 33],
        [10,  0],
        [10,  4],
        [10,  5],
        [11,  0],
        [12,  0],
        [12,  3],
        [13,  0],
        [13,  1],
        [13,  2],
        [13,  3],
        [13, 33],
        [14, 32],
        [14, 33],
        [15, 32],
        [15, 33],
        [16,  5],
        [16,  6],
        [17,  0],
        [17,  1],
        [18, 32],
        [18, 33],
        [19,  0],
        [19,  1],
        [19, 33],
        [20, 32],
        [20, 33],
        [21,  0],
        [21,  1],
        [22, 32],
        [22, 33],
        [23, 25],
        [23, 27],
        [23, 29],
        [23, 32],
        [23, 33],
        [24, 25],
        [24, 27],
        [24, 31],
        [25, 23],
        [25, 24],
        [25, 31],
        [26, 29],
        [26, 33],
        [27,  2],
        [27, 23],
        [27, 24],
        [27, 33],
        [28,  2],
        [28, 31],
        [28, 33],
        [29, 23],
        [29, 26],
        [29, 32],
        [29, 33],
        [30,  1],
        [30,  8],
        [30, 32],
        [30, 33],
        [31,  0],
        [31, 24],
        [31, 25],
        [31, 28],
        [31, 32],
        [31, 33],
        [32,  2],
        [32,  8],
        [32, 14],
        [32, 15],
        [32, 18],
        [32, 20],
        [32, 22],
        [32, 23],
        [32, 29],
        [32, 30],
        [32, 31],
        [32, 33],
        [33,  8],
        [33,  9],
        [33, 13],
        [33, 14],
        [33, 15],
        [33, 18],
        [33, 19],
        [33, 20],
        [33, 22],
        [33, 23],
        [33, 26],
        [33, 27],
        [33, 28],
        [33, 29],
        [33, 30],
        [33, 31],
        [33, 32]])
   

inde是稀疏表示的,并不是n*n的邻接矩阵

   

使用networkx可视化展示

  In [5]:
from torch_geometric.utils import to_networkx

G = to_networkx(data, to_undirected=True)
visualize_graph(G, color=data.y)
       

Graph Neural Networks 网络定义:

  • GCN layer (Kipf et al. (2017)) 定义如下: $$ \mathbf{x}_v^{(\ell + 1)} = \mathbf{W}^{(\ell + 1)} \sum_{w \in \mathcal{N}(v) \, \cup \, \{ v \}} \frac{1}{c_{w,v}} \cdot \mathbf{x}_w^{(\ell)} $$
  • PyG 文档 GCNConv
  In [6]:
import torch
from torch.nn import Linear
from torch_geometric.nn import GCNConv


class GCN(torch.nn.Module):
    def __init__(self):
        super().__init__()
        torch.manual_seed(1234)
        self.conv1 = GCNConv(dataset.num_features, 4) # 只需定义好输入特征和输出特征即可
        self.conv2 = GCNConv(4, 4)
        self.conv3 = GCNConv(4, 2)
        self.classifier = Linear(2, dataset.num_classes)

    def forward(self, x, edge_index):
        h = self.conv1(x, edge_index) # 输入特征与邻接矩阵(注意格式,上面那种)
        h = h.tanh()
        h = self.conv2(h, edge_index)
        h = h.tanh()
        h = self.conv3(h, edge_index)
        h = h.tanh()  
        
        # 分类层
        out = self.classifier(h)

        return out, h

model = GCN()
print(model)
   
GCN(
  (conv1): GCNConv(34, 4)
  (conv2): GCNConv(4, 4)
  (conv3): GCNConv(4, 2)
  (classifier): Linear(in_features=2, out_features=4, bias=True)
)
   

输出特征展示

  • 最后不是输出了两维特征嘛,画出来看看长啥样
  • 但是,但是,现在咱们的模型还木有开始训练。。。
  In [7]:
model = GCN()

_, h = model(data.x, data.edge_index)
print(f'Embedding shape: {list(h.shape)}')

visualize_embedding(h, color=data.y)
   
Embedding shape: [34, 2]
     

训练模型(semi-supervised)

  In [8]:
import time

model = GCN()
criterion = torch.nn.CrossEntropyLoss()  # Define loss criterion.
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)  # Define optimizer.

def train(data):
    optimizer.zero_grad()  
    out, h = model(data.x, data.edge_index) #h是两维向量,主要是为了咱们画个图 
    loss = criterion(out[data.train_mask], data.y[data.train_mask])  # semi-supervised
    loss.backward()  
    optimizer.step()  
    return loss, h

for epoch in range(401):
    loss, h = train(data)
    if epoch % 10 == 0:
        visualize_embedding(h, color=data.y, epoch=epoch, loss=loss)
        time.sleep(0.3)
        
                                                                                      In [ ]:
 

标签:基本,index,33,32,31,pytorch,edge,geometric,data
From: https://www.cnblogs.com/zhangxianrong/p/17728707.html

相关文章

  • DP 简介及基本知识
    动态规划(DynamicProgramming,DP)是一种将复杂的问题分解为简单子问题的方式来解决问题的方法。动态规划中主要由两个部分组成:一为状态,二为转移。状态和转移就组成了一个有向的状态转移图。动态规划需要满足有拓扑序(当拓扑序不知道但有,可以考虑拓扑排序,找到拓扑序,或者记忆化......
  • pytorch(3-2) 多层 线性回归 训练和预测代码
     脱离网页化python没有可视化    #%matplotlibinlineimporttorchimporttorchvisionfromtorch.utilsimportdatafromtorchvisionimporttransformsfromd2limporttorchasd2l#通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,#并除以2......
  • Java NIO 底层原理的基本思想?
    作者:Java架构资深进阶链接:https://zhuanlan.zhihu.com/p/268805428来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。写在前面1.1.JavaIO读写原理1.1.1.内核缓冲与进程缓冲区1.1.2.javaIO读写的底层流程1.2.四种主要的IO模型1.3.同步......
  • 企业ERP的基本流程
    ERP是企业资源计划,ERP系统主要是优化企业内部的业务流程,用信息化管控的方式进行采购管理、库存管理、销售管理、财务管理等模块。它可以看作是进销存系统的进阶版。ERP侧重企业资源规划,无法进行生产精细化管理ERP运作流程ERP包含两类流程:计划管理和执行计划管理,计划管理包括生......
  • Python 基本语法
    在开始学习Python编程语言之前,首先要掌握基本的语法。本文将介绍Python编程语言的基本语法,帮助初学者顺利进入Python编程世界。一、Python编程语言概述Python是一种高级编程语言,具有简单易学、语法简洁、功能强大等特点。Python支持多种编程范式,包括面向对象、面向......
  • Phytium Pi OS的基本配置
    前言本文基于飞腾派OS官方文档,对操作步骤和注意事项加以补充说明。开发环境系统要求可以先运行sudoaptupdate更新软件环境。首先需要检查对应软件是否已安装,可以使用dpkg-l|grep<软件包名>来检查。下面针对给出的软件包提供脚本,可以更便捷地检查是否已安装:#!/bin/bash......
  • PostgreSQL教程:事务的ACID特性及基本使用
    什么是ACID?在日常操作中,对于一组相关操作,通常要求要么都成功,要么都失败。在关系型数据库中,称这一组操作为事务。为了保证整体事务的安全性,有ACID这一说:原子性A:事务是一个最小的执行单位,一次事务中的操作要么都成功,要么都失败。一致性C:在事务完成时,所有数据必须保持在一致的状态。(事......
  • MongoDB の 安装与基本使用
    安装mongo建议使用docker直接一键安装dockerrun--namemongo_zdp-p27017:27017-dmongo:latestGUI工具,我使用过的有两个,一个是navicate,一个是nosqlbooster。下载地址如下https://nosqlbooster.com/downloadsmysql和mogodb名称的对比mysqlMongoDB数据......
  • ansible教程:with_fileglob基本用法示例
    with_fileglob是Ansible的循环迭代器,用于在任务中对文件进行模式匹配并迭代处理。它可以用于从本地文件系统中选择匹配特定模式的文件,并将它们作为迭代项传递给任务。以下是with_fileglob的基本用法示例:-name:Processfiles<module_name>:src:"{{item}}"with_......
  • 深度学习入门——卷积神经网络CNN基本原理+实战
    beginning今天给小伙伴们介绍一个高级的分类方法——卷积神经网络CNN,并学习用CNN实现图像的分类。作为深度学习的基础,CNN可太重要了呐,在图像分类、目标检测、目标跟踪、语义分割、实例分割等领域随处可见它的身影。废话不多说啦,如果你也对CNN感兴趣的话,赶紧跟我一起愉快的看下去叭......