MindSpore实践图神经网络03加载图数据集
【摘要】 MindSpore提供的`mindspore.dataset`模块可以帮助用户构建数据集对象,分批次地读取文本数据。
数据集介绍
- 通常一个图(graph)
G
是由一系列的节点(vertices)V
以及边(eage)E
组成的,每条边都连接着图中的两个节点,用公式可表述为:G = F(V, E)
,简单的图如下所示。
- 图中包含节点V = {a, b, c, d},和边E = {(a, b), (b, c), (c, d), (d, b)},针对图中的连接关系通常需借助数学的方式进行描述,如常用的基于邻接矩阵的方式,用于描述上述图连接关系的矩阵C如下,其中a、 b、c、d对应为第1、2、 3、4个节点。
MindSpore图数据集处理
- MindSpore提供的
mindspore.dataset
模块可以帮助用户构建数据集对象,分批次地读取文本数据。
数据集下载
(1) 数据集介绍
-
常用的图数据集包含Cora、Citeseer、PubMed等
-
原始数据集可以从ucsc网站进行下载,
-
github提供的预处理后的数据集,GCN等公开使用
-
Cora数据集主体部分(
cora.content
)-
2708条样本(节点),每条样本描述1篇科学论文的信息,论文都属于7个类别中的一个。每条样本数据包含三部分,依次为论文编号、论文的词向量(一个1433位的二进制)、论文的类别;
-
引用数据集部分(
cora.cites
)包含5429行(边),每行包含两个论文编号,表示第二篇论文对第一篇论文进行了引用。
-
数据集下载:下载预处理后的cora数据集目录如下:
.
└── cora
├── ind.cora.allx
├── ind.cora.ally
├── ind.cora.graph
├── ind.cora.test.index
├── ind.cora.tx
├── ind.cora.ty
├── ind.cora.x
├── ind.cora.y
├── trans.cora.graph
├── trans.cora.tx
├── trans.cora.ty
├── trans.cora.x
└── trans.cora.y
(2)数据集下载
以下示例代码将cora数据集下载并解压到指定位置。
!mkdir -p ./cora
!git clone https://github.com/kimiyoung/planetoid
!cp planetoid/data/*.cora.* ./cora
!rm -rf planetoid
环境配置
- 环境尽量是Linux环境,数据处理bash脚本执行会报错,尝试修改几次后换成Linux成功
- Linux操作系统: Ubuntu
- Python:3.9
- MindSpore:1.8
问题描述
- (1)下载的原始数据集加载报错
- (2)数据集格式转换,Window下转换脚本没法执行
- (3)Jupyter无法执行数据集转换也报错
根因分析
- (1)原始数据集不符合MindSpore数据集的格式,需要格式转换后再加载
- (2)Window下转换脚本路径和Linux不同,bash脚本最好是在linux上进行,特别是含有路径的脚本
- (3)Jupyter默认的环境没用mindSpore,需要切换环境或转命令行执行(推荐后者)
解决方案
- (1)数据集格式转换:将数据集转换为MindRecord格式,可借助models仓库提供的转换脚本进行转换,生成的MindRecord文件在
./cora_mindrecord
路径下。
!git clone https://gitee.com/mindspore/models.git
SRC_PATH = "./cora"
MINDRECORD_PATH = "./cora_mindrecord"
!rm -rf $MINDRECORD_PATH
!mkdir $MINDRECORD_PATH
!python models/utils/graph_to_mindrecord/writer.py --mindrecord_script cora --mindrecord_file "$MINDRECORD_PATH/cora_mr" --mindrecord_partitions 1 --mindrecord_header_size_by_bit 18 --mindrecord_page_size_by_bit 20 --graph_api_args "$SRC_PATH"
- (2)重新配置Linux环境(如果已经是Linux则跳过)
# 控制台安装mindspore
conda create -n mindspore python=3.9
conda activate mindspore
pip 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
# 自动安装
wget https://gitee.com/mindspore/mindspore/raw/r1.8/scripts/install/ubuntu-cpu-pip.sh
# 安装MindSpore 1.8.1和Python 3.7
MINDSPORE_VERSION=1.8.1 bash ./ubuntu-cpu-pip.sh
# 验证是否安装成功
python -c "import mindspore;mindspore.run_check()"
(3)Jupyter 执行报错,换成命令行执行数据集处理脚本
!source activate py37_ms16
!python models/utils/graph_to_mindrecord/writer.py --mindrecord_script cora --mindrecord_file "$MINDRECORD_PATH/cora_mr" --mindrecord_partitions 1 --mindrecord_header_size_by_bit 18 --mindrecord_page_size_by_bit 20 --graph_api_args "$SRC_PATH"
- 乖乖命令行试试,成功
source activate py37_ms16
python models/utils/graph_to_mindrecord/writer.py --mindrecord_script cora --mindrecord_file "./cora_mindrecord/cora_mr" --mindrecord_partitions 1 --mindrecord_header_size_by_bit 18 --mindrecord_page_size_by_bit 20 --graph_api_args "./cora"
继续数据集实验
-
MindSpore目前支持加载文本领域常用的经典数据集和多种数据存储格式下的数据集,用户也可以通过构建自定义数据集类实现自定义方式的数据加载。
-
下面演示使用
MindSpore.dataset
模块中的MindDataset
类加载上述已转换成mindrecord格式的cora数据集。
(1)配置数据集目录,创建数据集对象。
import mindspore.dataset as ds
import numpy as np
data_file = "./cora_mindrecord/cora_mr"
dataset = ds.GraphData(data_file)
(2)访问对应的接口,获取图信息及特性、标签内容。
# 查看图中结构信息
graph = dataset.graph_info()
print("graph info:", graph)
# 获取所有的节点信息
nodes = dataset.get_all_nodes(0)
nodes_list = nodes.tolist()
print("node shape:", len(nodes_list))
# 获取特征和标签信息,总共2708条数据
# 每条数据中特征信息是用于描述论文i,长度为1433的二进制表示,标签信息指的是论文所属的种类
raw_tensor = dataset.get_node_feature(nodes_list, [1, 2])
features, labels = raw_tensor[0], raw_tensor[1]
print("features shape:", features.shape)
print("labels shape:", labels.shape)
print("labels:", labels)
数据处理
- MindSpore目前支持的数据处理算子及其详细使用方法。下面构建pipeline,对节点进行采样等操作。
(1)获取节点的邻居节点,构造邻接矩阵。
neighbor = dataset.get_all_neighbors(nodes_list, 0)
# neighbor的第一列是node_id,第二列到最后一列存储的是第一列的邻居节点,如果不存在这么多,则用-1补齐。
print("neighbor:\n", neighbor)
(2)依据节点的邻居节点信息,构造邻接矩阵。
nodes_num = labels.shape[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):
# neighbor的第一列是node_id,第二列到最后一列存储的是第一列的邻居节点,如果不存在这么多,则用-1补齐。
if value >= 0 and index[1] > 0:
adj[node_map[neighbor[index[0], 0]], node_map[value]] = 1
print("adj:\n", adj)
(3)节点采样,支持常见的多次跳跃采样与随机游走采样方法等。
- 多跳邻接点采样如(a)图所示,当次采样的节点将作为下次采样的起始点;随机游走方式如(b)图所示,随机选择一条路径依次遍历相邻的节点,对应图中则选择了从Vi到Vj的游走路径。
# 基于多次跳跃进行节点采样
neighbor = dataset.get_sampled_neighbors(nodes_list[0:21], [2], [0])
print("neighbor:\n", neighbor)
# 基于随机游走进行节点采样
meta_path = [0]
walks = dataset.random_walk(nodes_list[0:21], meta_path)
print("walks:\n", walks)
(4)通过节点获取边/通过边获取节点。
# 通过边获取节点
part_edges = dataset.get_all_edges(0)[:10]
nodes = dataset.get_nodes_from_edges(part_edges)
print("part edges:", part_edges)
print("nodes:", nodes)
# 通过节点获取边
# nodes_pair_list = [(0, 1), (1, 2), (1, 3), (1, 4)]
# edges = dataset.get_edges_from_nodes(nodes_pair_list)
# print("edges:", edges)
小结
- 本次主要体验MindSpore数据集处理模块,在图表示学习中,图数据集的处理也是相当重要的一个步骤,也是模型训练的第一步。数据集的好坏也将在一定程度上影响模型的性能。第一次实践图数据集加载,出现不少问题,特别是数据预处理阶段,需要不断实践。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)