图神经网络初步实验

实验复现来源

https://zhuanlan.zhihu.com/p/603486955

该文章主要解决问题:

1.加深对图神经网络数据集的理解

2.加深对图神经网络模型中喂数据中维度变化的理解

原理问题在另一篇文章分析:
介绍数据集:cora数据集

其中的主要内容表示为一堆文章,有自己的特征内容,有自己的编号,有自己的类别(标签),相互引用的关系构成了图。

cora.content:包含特征编号,特征内容,特征类别(标签)

31336	0	0	0	0	0	0 ....0 Neural_Networks
1061127	0	0	0	0	0	0 ....0 Rule_Learning
1106406	0	0	0	0	0	0 ....0 Reinforcement_Learning
13195	0	0	0	0	0	0 ....0 Reinforcement_Learning
37879	0	0	0	0	0	0 ....0 Probabilistic_Methods

1.其中左面第一列表示特征编号

2.中间的内容表示特征内容(1433维)

3.右面的最后一列表示标签

cora.cite:引用关系,也称作边

35	1033
35	103482
35	103515
35	1050679
35	1103960
35	1103985
35	1109199
35	1112911

左面第一列表示起始点(序号),右面表示终止点(序号),其中一行表示一个边,表示两个点的连接

以点作为主要特征进行分类

首先先看一下GCN网络的参数部分

self.conv1 = GCNConv(in_channels=16, out_channels=32, add_self_loops=True, normalize=True)

主要参数就是输入的维度,输出的维度

# 前向传播时调用
output = self.conv1(x, edge_index, edge_weight)

主要的参数为结点的特征矩阵与图的连接关系

也就是说数据需要预处理成结点的特征矩阵,然后单独的标签,再预处理出图的连接关系

分为三个部分。

1.数据预处理

from plistlib import Data
from torch_geometric.data import Data
import torch
#print(torch.__version__)
import torch.nn.functional as F
# import sys
# print(sys.executable)
# import torch_geometric
# print(torch_geometric.__version__)
datasetPath = 'E:/pytorch/pytorch exercise/Graph neural network/Cora dataset/cora'
node_feature_file = 'E:/pytorch/pytorch exercise/Graph neural network/Cora dataset/cora/Cora.content'
edge_file = 'E:/pytorch/pytorch exercise/Graph neural network/Cora dataset/cora/Cora.cites'
label_mapping = {}
node_features = []
node_labels = []
node_ids = {}  #特征数
# 定义一个计数器,遍历所有可能的标签
current_label = 0

with open(node_feature_file,'r') as f:
    for line in f:
        parts = line.strip().split('\t')
        node_id = int(parts[0])
        features = list(map(float, parts[1:-1]))  # 特征
        label_str = parts[-1]
        if label_str not in label_mapping:
            label_mapping[label_str] = current_label
            current_label +=1
            # 将标签转换为整数
        label = label_mapping[label_str]
        node_ids[node_id] = len(node_features) #补充结点索引
        node_features.append(features)     #将节点特征依次按照数量拼接在一起
        node_labels.append(label)
#print(node_ids)
# 将节点特征和标签转换为 tensor
node_features = torch.tensor(node_features, dtype=torch.float)
# 输出张量的形状
print(node_features.shape)
# 或者使用 .size() 也能得到相同的结果
print(node_features.size())

node_labels = torch.tensor(node_labels, dtype=torch.long)
print("node_labels size = ",node_labels.size())
edge_index = []
with open(edge_file, 'r') as f:
    for line in f:
        parts = line.strip().split('\t')
        source = int(parts[0])  # 源节点
        target = int(parts[1])  # 目标节点

        source_idx = node_ids[source]  # 获取节点ID的索引
        target_idx = node_ids[target]
        edge_index.append([source_idx, target_idx])#引用边的信息,生成边的索引集合
# print(source_idx)
# print(target_idx)
edge_index = torch.tensor(edge_index, dtype=torch.long).t().contiguous()
print("edge_index size = ",edge_index.size())
#print(edge_index.shape())
data = Data(x=node_features, edge_index=edge_index, y=node_labels)
# 输出数据的一些信息
print(f'节点特征矩阵 shape: {data.x.shape}')
print(f'边的连接关系 (edge_index) shape: {data.edge_index.shape}')
print(f'节点标签 shape: {data.y.shape}')

# 输出第一个节点的特征和标签
print(f'节点 0 的特征: {data.x[0]}')
print(f'节点 0 的标签: {data.y[0]}')









其中

node_features表示所有点的特征结合在一起
node_labels表示所有标签集中在一起
node_ids表示特征点的个数

首先是从数据集中抽取特征矩阵的过程

with open(node_feature_file,'r') as f:  #打开文件
    for line in f:                      #按照行为单位,开始进行遍历
        parts = line.strip().split('\t')#删除其他空格与回车
        node_id = int(parts[0])        #将第一个元素放入node_id
        features = list(map(float, parts[1:-1]))  # 将第二个到倒数第二个元素一并放入features
        label_str = parts[-1]                #最后一个元素放入标签
        if label_str not in label_mapping:    #处理标签为null的情况
            label_mapping[label_str] = current_label
            current_label +=1
            # 将标签转换为整数
        label = label_mapping[label_str]    
        node_ids[node_id] = len(node_features) #补充结点索引
#为新的node_id分配一个新的整数索引,比如第一个元素node-id=35422,那么就是node_ids[35422] = 1
#也就是为第一个名字为35422的节点编辑了一个序号1,表示第一个元素


        node_features.append(features)     #将节点特征依次按照数量拼接在一起
        node_labels.append(label)           #拼接标签到一个集合中 

从数据集中提取边的集合

edge_index = []
with open(edge_file, 'r') as f:
    for line in f:
        parts = line.strip().split('\t')
        source = int(parts[0])  # 源节点
        target = int(parts[1])  # 目标节点

        source_idx = node_ids[source]  # 获取节点ID的索引
        target_idx = node_ids[target]
        edge_index.append([source_idx, target_idx])#引用边的信息,生成边的索引集合

转换成data对象

edge_index = torch.tensor(edge_index, dtype=torch.long).t().contiguous()
data = Data(x=node_features, edge_index=edge_index, y=node_labels)

简易的模型

class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = GCNConv(data.x.size(1), 16)  # 输入特征维度是 data.x.size(1),输出 16 个特征

        # 计算类别数,假设 data.y 是节点标签
        num_classes = data.y.max().item() + 1  # 获取类别数

        # 第二层卷积层,输出类别数个特征
        self.conv2 = GCNConv(16, num_classes)
    def forward(self,x,edge_index):
        x = self.conv1(x, edge_index)        #输入特征矩阵与边的索引集合
        x = F.relu(x)                        #卷积后激活
        x = self.conv2(x, edge_index)
        return F.log_softmax(x, dim=1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

雪花算法生成的ID在返回给前端之后和生成的不一样,到底是什么原因?

一、背景: 最近在做项目的时候发现用雪花算法生成的id传给前端以后跟生成的不一样,就纳闷,在想为什么会出现这样的问题? 二、问题分析: 最开始以为是序列化的问题导致的仔细对比以后发现前端是后几位不一样都是0&…

【大数据学习 | kafka高级部分】kafka中的选举机制

controller的选举 首先第一个选举就是借助于zookeeper的controller的选举 第一个就是controller的选举,这个选举是借助于zookeeper的独享锁实现的,先启动的broker会在zookeeper的/contoller节点上面增加一个broker信息,谁创建成功了谁就是主…

js例轮播图定时器版

要求 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-width, ini…

jvm学习笔记-轻量级锁内存模型

一&#xff0c;轻量级锁 LockRecord的那个第一个成员变量是拷贝对应锁定了的java对象资源的MarkWord&#xff0c;Lock Record有一个Ptr指针刚开始指向自己&#xff0c;后面这个指针存储在锁定资源的java对象的markword中&#xff0c;后续可以通过java对象的MarkWord快速定位到…

职场浅谈:情商高的“4”种表现,情商高的人才更容易走向成功

职场上&#xff0c;情商高的人总是让人感觉很舒服&#xff0c;也让人情不自禁的愿意和他交往。高情商的人&#xff0c;最大的优点就是让人感觉舒服&#xff0c;这种舒服由内自外&#xff0c;让你情不自禁的对他产生好感&#xff0c;并且发自内心的愿意和他在一起&#xff0c;也…

win11电脑无法找到声音输出设备怎么办?查看解决方法

电脑无法找到声音输出设备是一个常见的问题&#xff0c;尤其是在使用Windows操作系统时。幸运的是&#xff0c;大部分问题都可以通过以下几种方法来解决。 一、检查物理连接 在深入诊断之前&#xff0c;首先要检查硬件连接是否正常。这包括&#xff1a; 确保耳机、扬声器或其…

大模型微调技术 --> LoRA 系列之 QLoRA (省资源能手)

QLoRA 1.摘要 作者提出了QLoRA&#xff0c;一种有效的微调方法&#xff0c;可以减少内存使用&#xff0c;足以在单个48 GB GPU上微调 65B 参数模型&#xff0c;同时保留完整的 16位 微调任务性能。 QLoRA 通过冻结的4位量化预训练语言模型将梯度反向传播到低秩适配器&#x…

Vert.x,应用监控 - 基于Micrometer / Prometheus

对于企业级的应用程序来说&#xff0c;我们需要通过运行指标(metrics)的监控&#xff0c;来了解(监控)程序的运行状态。Vert.x的核心组件内置了大量的运行指标&#xff0c;并支持通过Micrometer来管理这些运行指标并向后端报告。 目前Vertx内置运行指标的核心组件包括: TCP/HTT…

如何用PPT画箭头?用这2个ppt软件快速完成绘图!

ppt怎么画箭头&#xff1f; 有时在ppt中绘制流程图或传达承上启下的含义时&#xff0c;会用到箭头形状&#xff0c;运用到箭头元素来增强表达的清晰度和逻辑性。那可能有人会问&#xff0c;ppt怎么画箭头&#xff1f; 这似乎是一个小问题&#xff0c;但如果你对ppt工具不够熟…

java: 无法访问org.springframework.web.bind.annotation.RequestMapping

一、报错问题 java: 无法访问org.springframework.web.bind.annotation.RequestMapping 二、原因分析 SpringBoot使用了3.0或者3.0以上&#xff0c;因为Spring官方发布从Spring6以及SprinBoot3.0开始最低支持JDK17。所以仅需要将SpringBoot版本降低为3.0以下即可&#xff08;或…

[ DOS 命令基础 3 ] DOS 命令详解-文件操作相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【TS】九天学会TS语法——3.TypeScript 函数

今天学习 TypeScript 的函数&#xff0c;包括函数类型、可选参数、默认参数、剩余参数。 函数声明和表达式函数类型可选参数和默认参数剩余参数 在 TypeScript 中&#xff0c;函数是编程的核心概念之一。它们允许我们将代码组织成可重用的块&#xff0c;并提供了强大的抽象能力…

Kafka 源码 KRaft 模式本地运行

KRaft&#xff08;Kafka Raft Metadata mode&#xff09;&#xff0c;从版本 2.8.0 开始作为测试特性引入&#xff0c;并在后续版本中持续得到改进和增强。 KRaft 模式是指 Kafka 使用 Raft 协议来管理集群元数据的一种运行模式&#xff0c;这标志着 Kafka 向去除对 ZooKeeper …

day05(单片机)SPI+数码管

目录 SPI数码管 SPI通信 SPI总线介绍 字节交换原理 时序单元 ​​​​​​​SPI模式 模式0 模式1 模式2 模式3 数码管 介绍 74HC595芯片分析 ​​​​​​​原理图分析 ​​​​​​​cubeMX配置​​​​​​​ 程序编写 硬件SPI ​​​​​​​软件SPI 作业&#xff1a; SPI数…

数据结构和算法-贪心算法01- 认识贪心

贪心算法 什么是贪心算法 一个贪心算法总是做出当前最好的选择&#xff0c;也就是说&#xff0c;它期望通过局部最优选择从而得到全局最优的解决方案。 ​ ----《算法导论》 贪心算法(Greedy Method): 所谓贪心算法就是重复地(或贪婪地)根据一个法则挑选解的一部分。当挑选完毕…

创新实践:基于边缘智能+扣子的智慧婴儿监控解决方案

在2024年全国大学生物联网设计竞赛中&#xff0c;火山引擎作为支持企业&#xff0c;不仅参与了赛道的命题设计&#xff0c;还为参赛队伍提供了相关的硬件和软件支持。以边缘智能和扣子的联合应用为核心&#xff0c;参赛者们在这场竞赛中的方案展现出了卓越的创新性和实用性&…

6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼

文章目录 1、SonarLint2、JRebel for IntelliJ3、SwaggerHub插件4、Lombok插件5、RestfulTool插件6、 Json2Pojo插件7、结论 对于任何Spring Boot开发者来说&#xff0c;两个首要的目标是最大限度地提高工作效率和确保高质量代码。IntelliJ IDEA 是目前最广泛使用的集成开发环境…

CSS弹性布局:灵活布局的终极指南

在网页设计中&#xff0c;CSS 弹性布局&#xff08;Flexbox&#xff09;是一个不可或缺的工具。它能帮助你轻松地排列和对齐元素&#xff0c;尤其是在响应式设计中表现出色。今天&#xff0c;我们就来深入探讨一下 Flexbox 的各个属性&#xff0c;让你彻底掌握这个强大的布局工…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!

目录 一、CTF简介 二、CTF竞赛模式 三、CTF各大题型简介 四、CTF学习路线 4.1、初期 1、htmlcssjs&#xff08;2-3天&#xff09; 2、apachephp &#xff08;4-5天&#xff09; 3、mysql &#xff08;2-3天&#xff09; 4、python (2-3天) 5、burpsuite &#xff08;…