MindSpore实践图神经网络之GCN

2024-05-31 15:20

本文主要是介绍MindSpore实践图神经网络之GCN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GCN介绍

  • 图卷积网络(GCN)于2016年提出,旨在对图结构数据进行半监督学习。它提出了一种基于卷积神经网络有效变体的可扩展方法,可直接在图上操作。该模型在图边缘的数量上线性缩放,并学习隐藏层表示,这些表示编码了局部图结构和节点特征。

  • GCN(图卷积神经网络) 类似CNN(卷积神经网络),只不过CNN用于二维数据结构,GCN用于图数据结构。GCN实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。GCN精妙地设计了一种从图数据中提取特征的方法。

  • GCN包含两个图卷积层。每一层以节点特征和邻接矩阵为输入,通过聚合相邻特征来更新节点特征。

环境配置

  • 配置MindSpore环境
# 控制台安装mindspore 
conda create -n py39_ms18 python=3.9
conda activate py39_ms18pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.8.1/MindSpore/cpu/x86_64/mindspore-1.8.1-cp39-cp39-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple# 验证是否安装成功
python -c "import mindspore;mindspore.run_check()"conda activate py39_ms18
  • 配置python环境
conda activate py39_ms18pip install numpy
pip install scipy
pip install sklearn
pip install pyyaml
# 缺包
pip  install matplotlib

算子开发

  • 算子开发:Layer、Model
# 定义算子:Layer
class GraphConvolution(nn.Cell):def __init__(self,feature_in_dim,feature_out_dim,dropout_ratio=None,activation=None):super(GraphConvolution, self).__init__()self.in_dim = feature_in_dimself.out_dim = feature_out_dimself.weight_init = glorot([self.out_dim, self.in_dim])self.fc = nn.Dense(self.in_dim,self.out_dim,weight_init=self.weight_init,has_bias=False)self.dropout_ratio = dropout_ratioif self.dropout_ratio is not None:self.dropout = nn.Dropout(keep_prob=1-self.dropout_ratio)self.dropout_flag = self.dropout_ratio is not Noneself.activation = get_activation(activation)self.activation_flag = self.activation is not Noneself.matmul = P.MatMul()def construct(self, adj, input_feature):"""GCN graph convolution layer."""dropout = input_featureif self.dropout_flag:dropout = self.dropout(dropout)fc = self.fc(dropout)output_feature = self.matmul(adj, fc)if self.activation_flag:output_feature = self.activation(output_feature)return output_feature# 定义模型:Model
class GCN(nn.Cell):def __init__(self, config, input_dim, output_dim):super(GCN, self).__init__()self.layer0 = GraphConvolution(input_dim, config.hidden1, activation="relu", dropout_ratio=config.dropout)self.layer1 = GraphConvolution(config.hidden1, output_dim, dropout_ratio=None)def construct(self, adj, feature):output0 = self.layer0(adj, feature)output1 = self.layer1(adj, output0)return output1
  • 数据处理utils
# 归一化邻接矩阵
def normalize_adj(adj):"""Symmetrically normalize adjacency matrix."""rowsum = np.array(adj.sum(1))d_inv_sqrt = np.power(rowsum, -0.5).flatten()d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0.d_mat_inv_sqrt = sp.diags(d_inv_sqrt)return adj.dot(d_mat_inv_sqrt).transpose().dot(d_mat_inv_sqrt).tocoo()# 加载数据集  : Cora
def get_adj_features_labels(data_dir):"""Get adjacency matrix, node features and labels from dataset."""g = ds.GraphData(data_dir)nodes = g.get_all_nodes(0)nodes_list = nodes.tolist()row_tensor = g.get_node_feature(nodes_list, [1, 2])features = row_tensor[0]labels = row_tensor[1]nodes_num = labels.shape[0]class_num = labels.max() + 1labels_onehot = np.eye(nodes_num, class_num)[labels].astype(np.float32)neighbor = g.get_all_neighbors(nodes_list, 0)node_map = {node_id: index for index, node_id in enumerate(nodes_list)}adj = np.zeros([nodes_num, nodes_num], dtype=np.float32)for index, value in np.ndenumerate(neighbor):# The first column of neighbor is node_id, second column to last column are neighbors of the first column.# So we only care index[1] > 1.# If the node does not have that many neighbors, -1 is padded. So if value < 0, we will not deal with it.if value >= 0 and index[1] > 0:adj[node_map[neighbor[index[0], 0]], node_map[value]] = 1adj = sp.coo_matrix(adj)adj = adj + adj.T.multiply(adj.T > adj) + sp.eye(nodes_num)nor_adj = normalize_adj(adj)nor_adj = np.array(nor_adj.todense())return nor_adj, features, labels_onehot, labels# 数据集划分
def get_mask(total, begin, end):"""Generate mask."""mask = np.zeros([total]).astype(np.float32)mask[begin:end] = 1return mask

Windows环境跑脚本报错(1)

问题描述

/mnt/d/mindspore_gallery/models/gnn/gcn/data
cora
data_mr exist
scripts/run_process_data.sh: line 46: cd: ../../../utils/graph_to_mindrecord: No such file or directory

根因分析

  • 由报错信息可以看出可能是数据集存放路径不对,或者windows下脚本和Linux不一致

解决办法

  • 修改路径,改为如下路径
../../utils/graph_to_mindrecord
  • 改到Linux环境,如果没有Linux环境可以安装WSL2,创建Ubuntu环境
    image.png

Windows环境跑脚本报错(2)

问题描述

{'data_dir': 'Dataset directory', 'train_nodes_num': 'Nodes numbers for training', 'eval_nodes_num': 'Nodes numbers for evaluation', 'test_nodes_num': 'Nodes numbers for test', 'save_TSNE': 'Whether to save t-SNE graph'}
Traceback (most recent call last):File "D:\mindspore_gallery\models\gnn\gcn\train.py", line 196, in <module>run_train()File "D:\mindspore_gallery\models\gnn\gcn\model_utils\moxing_adapter.py", line 105, in wrapped_funcrun_func(*args, **kwargs)File "D:\mindspore_gallery\models\gnn\gcn\train.py", line 114, in run_traincontext.set_context(mode=context.GRAPH_MODE,File "C:\Users\sunxiaobei\.conda\envs\py39_ms18\lib\site-packages\mindspore\_checkparam.py", line 1210, in wrapperreturn func(*args, **kwargs)File "C:\Users\sunxiaobei\.conda\envs\py39_ms18\lib\site-packages\mindspore\_checkparam.py", line 1179, in wrapperreturn func(*args, **kwargs)File "C:\Users\sunxiaobei\.conda\envs\py39_ms18\lib\site-packages\mindspore\context.py", line 911, in set_contextraise ValueError(f"For 'context.set_context', package type {__package_name__} support 'device_target' "
ValueError: For 'context.set_context', package type mindspore support 'device_target' type cpu, but got Ascend.

根因分析

  • 从log上不难看出,是代码指定的设备不一致,当前设备只有CPU,但是指定的是Ascent , 需要指定和实际环境一致的设备

解决办法

  • 修改代码,指定CPU
    context.set_context(mode=context.GRAPH_MODE,device_target="CPU", save_graphs=False)  # CPU  Ascend  GPU

运行代码

python train.py --data_dir=./data_mr/citeseer --train_nodes_num=120

image.png

这篇关于MindSpore实践图神经网络之GCN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018306

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Prometheus与Grafana在DevOps中的应用与最佳实践

Prometheus 与 Grafana 在 DevOps 中的应用与最佳实践 随着 DevOps 文化和实践的普及,监控和可视化工具已成为 DevOps 工具链中不可或缺的部分。Prometheus 和 Grafana 是其中最受欢迎的开源监控解决方案之一,它们的结合能够为系统和应用程序提供全面的监控、告警和可视化展示。本篇文章将详细探讨 Prometheus 和 Grafana 在 DevO

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。 SpringBoot集成 pom <!--swagge

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

机器学习之监督学习(三)神经网络

机器学习之监督学习(三)神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一:TensorFlow搭建神经网络 4. 反向传播梯度下降 Back Propagation Gradient Descent模块二:激活函数 activ

【HarmonyOS】-TaskPool和Worker的对比实践

ArkTS提供了TaskPool与Worker两种多线程并发方案,下面我们将从其工作原理、使用效果对比两种方案的差异,进而选择适用于ArkTS图片编辑场景的并发方案。 TaskPool与Worker工作原理 TaskPool与Worker两种多线程并发能力均是基于 Actor并发模型实现的。Worker主、子线程通过收发消息进行通信;TaskPool基于Worker做了更多场景化的功能封装,例

vue2实践:第一个非正规的自定义组件-动态表单对话框

前言 vue一个很重要的概念就是组件,作为一个没有经历过前几代前端开发的我来说,不太能理解它所带来的“进步”,但是,将它与后端c++、java类比,我感觉,组件就像是这些语言中的类和对象的概念,通过封装好的组件(类),可以通过挂载的方式,非常方便的调用其提供的功能,而不必重新写一遍实现逻辑。 我们常用的element UI就是由饿了么所提供的组件库,但是在项目开发中,我们可能还需要额外地定义一

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源