现在是下午四点,我今天醒的太晚了,十二点才起床,然后打打炉石看看小说,一晃就到现在了。不过真的蛮有意思的。我得开始学习了,毕竟时间很紧张,我需要尽快达到毕业要求。
补充一下,其实喜欢看网文,一个是想象力,一个是yy,毕竟现实生活中得不到的网文里幻想一下也不错。
之前我在github上找个了简单的神经网络的项目看了看代码,现在我要去找一个图神经网络的项目。
我找了一下,但是我发现与其去找github上面的代码,不如直接问deep seek。
1
import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
# 加载 Cora 数据集
dataset = Planetoid(root='data/Cora', name='Cora')
data = dataset[0]
# 定义 GCN 模型
class GCN(torch.nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(GCN, self).__init__()
self.conv1 = GCNConv(input_dim, hidden_dim)
self.conv2 = GCNConv(hidden_dim, output_dim)
def forward(self, x, edge_index):
# 第一层 GCN
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
# 第二层 GCN
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
# 初始化模型
model = GCN(input_dim=dataset.num_features, hidden_dim=16, output_dim=dataset.num_classes)
# 定义优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
# 训练函数
def train():
model.train()
optimizer.zero_grad()
out = model(data.x, data.edge_index)
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
return loss.item()
# 测试函数
def test():
model.eval()
out = model(data.x, data.edge_index)
pred = out.argmax(dim=1)
correct = pred[data.test_mask] == data.y[data.test_mask]
acc = int(correct.sum()) / int(data.test_mask.sum())
return acc
# 训练和测试
for epoch in range(200):
loss = train()
if epoch % 10 == 0:
acc = test()
print(f'Epoch {epoch:03d}, Loss: {loss:.4f}, Test Acc: {acc:.4f}')
# 最终测试
acc = test()
print(f'Final Test Accuracy: {acc:.4f}')
2
我先把cora数据集下载到本地,赞美计算机,这个计算量人来干是不可能的。我感觉pycharm什么都能打开,比笔记本强多了。这个编号为35号的论文很强啊,像是后面的1033,103482什么的引用的都是它。
cora.content第一列很简单,无非就是论文编号嘛,后面的一大批01其实就是这1433个词会不会出现在论文里面,最后面还有一列,代表论文属于哪一类(一共有七个类)
3 planetoid方法
4
我终于看懂这个初始化模型是什么意思了
# 初始化模型
model = GCN(input_dim=dataset.num_features, hidden_dim=16, output_dim=dataset.num_classes)
其实神经网络的本质就是数学操作,矩阵操作,这个cora的节点特征矩阵就是一个2708行,1433列的二维矩阵,这个num_feature代表的是节点维度特征,这个model就是根据这1433个节点维度特征,这1433个关键词判断出这篇文章到底属于哪一类。所以这个模型就是通过两层图卷积,从1433映射为16再映射为7。
5
我看了这个图神经网络的代码,我就想说这和神经网络有什么区别,都是计算损失,都是反向传播。
我终于理解什么是边索引矩阵了,边索引矩阵要以一列为单位,上边是源点,下边是目标点。
区别在于神经网络是给每一个参数加权重,然后权重*参数,但是图神经网络是对矩阵进行操作
输出的时候也是如此,图神经网络要考虑到相邻的节点。
5
我看代码看的有点烦,我去刷刷申论行测什么的