没有合适的资源?快使用搜索试试~ 我知道了~
首页GCN论文源码(pytorch)超级详细注释讲解!
GCN论文源码(pytorch)超级详细注释讲解!
5星 · 超过95%的资源 75 下载量 86 浏览量
更新于2023-03-03
评论 20
收藏 92KB PDF 举报
本文参考了这篇文章:https://blog.csdn.net/weixin_36474809/article/details/89379727侵删 这篇文章的代码非常经典,很值得学习,如有错误请指正 utils.py import numpy as np import scipy.sparse as sp import torch ''' 先将所有由字符串表示的标签数组用set保存,set的重要特征就是元素没有重复, 因此表示成set后可以直接得到所有标签的总数,随后为每个标签分配一个编号,创建一个单位矩阵, 单位矩阵的每一行对应一个one-hot向量,也就是np.identity(len(
资源详情
资源评论
资源推荐
GCN论文源码(论文源码(pytorch)超级详细注释讲解!)超级详细注释讲解!
本文参考了这篇文章:https://blog.csdn.net/weixin_36474809/article/details/89379727侵删
这篇文章的代码非常经典,很值得学习,如有错误请指正这篇文章的代码非常经典,很值得学习,如有错误请指正
utils.py
import numpy as np
import scipy.sparse as sp
import torch
'''
先将所有由字符串表示的标签数组用set保存,set的重要特征就是元素没有重复,
因此表示成set后可以直接得到所有标签的总数,随后为每个标签分配一个编号,创建一个单位矩阵,
单位矩阵的每一行对应一个one-hot向量,也就是np.identity(len(classes))[i, :],
再将每个数据对应的标签表示成的one-hot向量,类型为numpy数组
'''
def encode_onehot(labels):
classes = set(labels) # set() 函数创建一个无序不重复元素集
classes_dict = {c: np.identity(len(classes))[i, :] for i, c in # identity创建方矩阵
enumerate(classes)} # 字典 key为label的值,value为矩阵的每一行
# enumerate函数用于将一个可遍历的数据对象组合为一个索引序列
labels_onehot = np.array(list(map(classes_dict.get, labels)), # get函数得到字典key对应的value
dtype=np.int32)
return labels_onehot
# map() 会根据提供的函数对指定序列做映射
# 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表
# map(lambda x: x ** 2, [1, 2, 3, 4, 5])
# output:[1, 4, 9, 16, 25]
def load_data(path="./data/cora/", dataset="cora"):
"""Load citation network dataset (cora only for now)"""
print('Loading {} dataset...'.format(dataset))
idx_features_labels = np.genfromtxt("{}{}.content".format(path, dataset),
dtype=np.dtype(str))
features = sp.csr_matrix(idx_features_labels[:, 1:-1], dtype=np.float32) # 储存为csr型稀疏矩阵
labels = encode_onehot(idx_features_labels[:, -1])
# content file的每一行的格式为 : +
# 分别对应 0, 1:-1, -1
# feature为第二列到倒数第二列,labels为最后一列
# build graph
# cites file的每一行格式为:
# 根据前面的contents与这里的cites创建图,算出edges矩阵与adj 矩阵
idx = np.array(idx_features_labels[:, 0], dtype=np.int32)
idx_map = {j: i for i, j in enumerate(idx)}
# 由于文件中节点并非是按顺序排列的,因此建立一个编号为0-(node_size-1)的哈希表idx_map,
# 哈希表中每一项为id: number,即节点id对应的编号为number
edges_unordered = np.genfromtxt("{}{}.cites".format(path, dataset),
dtype=np.int32)
# edges_unordered为直接从边表文件中直接读取的结果,是一个(edge_num, 2)的数组,每一行表示一条边两个端点的idx
edges = np.array(list(map(idx_map.get, edges_unordered.flatten())), # flatten:降维,返回一维数组
dtype=np.int32).reshape(edges_unordered.shape)
# 边的edges_unordered中存储的是端点id,要将每一项的id换成编号。
# 在idx_map中以idx作为键查找得到对应节点的编号,reshape成与edges_unordered形状一样的数组
adj = sp.coo_matrix((np.ones(edges.shape[0]), (edges[:, 0], edges[:, 1])), # coo型稀疏矩阵
shape=(labels.shape[0], labels.shape[0]),
dtype=np.float32)
# 根据coo矩阵性质,这一段的作用就是,网络有多少条边,邻接矩阵就有多少个1,
# 所以先创建一个长度为edge_num的全1数组,每个1的填充位置就是一条边中两个端点的编号,
# 即edges[:, 0], edges[:, 1],矩阵的形状为(node_size, node_size)。
# build symmetric adjacency matrix 论文里A^=(D~)^0.5 A~ (D~)^0.5这个公式
adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)
# 对于无向图,邻接矩阵是对称的。上一步得到的adj是按有向图构建的,转换成无向图的邻接矩阵需要扩充成对称矩阵
features = normalize(features)
adj = normalize(adj + sp.eye(adj.shape[0])) # eye创建单位矩阵,第一个参数为行数,第二个为列数
# 对应公式A~=A+IN
weixin_38686231
- 粉丝: 10
- 资源: 917
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- ExcelVBA中的Range和Cells用法说明.pdf
- 基于单片机的电梯控制模型设计.doc
- 主成分分析和因子分析.pptx
- 共享笔记服务系统论文.doc
- 基于数据治理体系的数据中台实践分享.pptx
- 变压器的铭牌和额定值.pptx
- 计算机网络课程设计报告--用winsock设计Ping应用程序.doc
- 高电压技术课件:第03章 液体和固体介质的电气特性.pdf
- Oracle商务智能精华介绍.pptx
- 基于单片机的输液滴速控制系统设计文档.doc
- dw考试题 5套.pdf
- 学生档案管理系统详细设计说明书.doc
- 操作系统PPT课件.pptx
- 智慧路边停车管理系统方案.pptx
- 【企业内控系列】企业内部控制之人力资源管理控制(17页).doc
- 温度传感器分类与特点.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论5