【GCN】 代码详解 (1) 如何运行【pytorch】可运行版本

请添加图片描述

前言

在前文中,已经对图卷积神经网络(Graph Convolutional Neural Networks, GCN)的理论基础进行了深入探讨。接下来的章节将会进入新的阶段,将借助PyTorch,这一强大的深度学习框架,通过实战讲解来展示如何构建和训练一个图卷积神经网络。这一过程不仅将帮助读者巩固理论知识,更重要的是,它将引导读者迈出理论到实践的关键一步,从而在处理具有图结构数据的问题上实现质的飞跃。

在本章节中,我将主要介绍如何运行代码以获取计算结果。考虑到我的读者多为初学者,我认为在深入探讨代码的各种细节之前,首先了解如何简单地运行模型并查看其结果是非常必要的。这不仅可以帮助读者快速入门,还能对模型的工作流程有一个直观的理解。

这个原文的代码地址感兴趣的读者自行下载即可 https://github.com/tkipf/pygcn

在这里插入图片描述

😃当然要是觉得还不错的话,烦请点赞,收藏➕关注👍

0.引言

这个代码是作者提供的在 PyTorch 环境下实现和运行图卷积网络代码。具体参见 Thomas Kipf 的博客 Graph Convolutional Networks (2016)。

重点重点重点
此外,这份 PyTorch 实现与原始的 TensorFlow 版本(见此链接)存在一些细微差异。当前的 PyTorch 版本主要是为了概念验证,而不意在复现原论文中报告的结果。所以其复现出来的结果和原始论文中存在一定差距,在对当前代码讲解后,笔者会对差异部分进行分析,并教大家如何复现乱嗯中的实验结果

该实现使用的是 Cora 数据集,其主要是分成了两个文件,这里不做过多的解释在下一个章节详细分析代码部分会解释。

1.环境配置

如果你之前已经配置好环境这部分可以忽略掉

对于准备在特定环境下运行图卷积网络(GCNs)的开发者来说,理解并配置适合的系统要求是至关重要的一步。以下是详细的系统和软件环境要求,以确保GCNs可以正确安装和运行。

必需的软件和库:

  • PyTorch: 必须安装版本 0.4 或 0.5。PyTorch 是执行深度学习模型,特别是图卷积网络在本实现中不可或缺的核心库。
  • Python: 支持的版本为 2.7 或 3.6。Python 是运行此图卷积网络代码的基本环境。

Python 包依赖:
确保这些包在 Python 环境中被正确安装,是模型正常运行的前提。你可以通过运行以下命令来安装或验证这些依赖:

pip install numpy torch scipy

上述的指令如何使用呢???

当你需要安装 numpy, torch, 或 scipy 等 Python 库时,可以通过使用 pip 命令来完成安装。这是 Python 的包安装器,能够从 Python 包索引(PyPI)自动下载并安装软件包。下面是一步步指导如何使用这条安装命令:

在 Jupyter Notebook 中使用 pip 安装命令:

  1. 打开 Jupyter Notebook

    • 启动 Jupyter Notebook,通常通过在终端中输入 jupyter notebook 命令启动。
  2. 新建一个终端

    • 在 Jupyter Notebook 的界面中,找到菜单栏中的“New”(新建),然后选择“Terminal”(终端)。这会打开一个新的命令行界面。
  3. 执行安装命令

    • 在打开的终端中,复制并粘贴 pip install numpy torch scipy 命令,然后按回车键执行。

在 Visual Studio Code (VSCode) 或其他 IDE 中使用 pip 安装命令:

  1. 打开 IDE

    • 启动你的 IDE,如 Visual Studio Code。
  2. 打开终端

    • 在 VSCode 中,可以通过选择顶部菜单的“Terminal”(终端)> “New Terminal”(新建终端)来打开一个终端。
  3. 执行安装命令

    • 在终端中,粘贴 pip install numpy torch scipy 命令并回车执行。

这样,你所需要的包就会被下载并安装到你的 Python 环境中。安装完成后,你可以在任何 Python 程序或脚本中导入并使用这些库。

注意事项:

  • 确保你的 Python 环境配置正确,pip 命令针对的是正确的 Python 版本。
  • 如果你使用的是 Python 3,则可能需要使用 pip3 命令代替 pip
  • 如果在安装过程中遇到权限问题,可以尝试在命令前添加 sudo(在 Linux 或 macOS 中),例如 sudo pip install numpy torch scipy,以提升权限执行安装。

通过按照上述指导,你可以轻松地在各种环境中安装 Python 包,以便于进行后续的开发和研究工作。

2. 代码的运行

在这里我仅仅展示如何修改代码保证模型的正确运行,下面是代码的文件划分:

请添加图片描述

根据你的运行环境,操作方式会有所不同。下面提供了在两种常见环境中运行 train.py 文件的方法:

在 IDE(如 PyCharm, VSCode 等)中运行 train.py

  1. 打开 IDE

    • 启动你的 IDE(例如 Visual Studio Code, PyCharm 等)。
  2. 打开 train.py 文件

    • 在 IDE 中打开包含 train.py 的项目文件夹。然后从项目文件树中找到并点击 train.py 文件,打开它。
  3. 运行脚本

    • 大多数 IDE 都有一个运行按钮,通常显示为一个绿色的三角形图标。在打开了 train.py 文件的窗口中,点击这个运行按钮即可开始执行脚本。
    • 你也可以通过 IDE 的顶部菜单找到“运行”或者“调试”选项来执行脚本。

在 Jupyter Notebook 中运行 train.py

  1. train.py 转换为 Notebook 格式

    • 首先,你需要将 train.py 文件的内容转换为单独的代码单元。这可能需要手动将脚本中的代码段分割并复制到 Jupyter Notebook 的不同单元格中。
  2. 执行代码单元

    • 在 Jupyter Notebook 中,你可以逐个运行每个代码单元。点击一个单元格,然后使用键盘快捷键 Shift + Enter 或点击工具栏的运行按钮来执行该单元格中的代码。
    • 确保按照 train.py 脚本中代码的原始顺序来执行各个单元格。

这些步骤提供了在不同开发环境中运行 Python 脚本的灵活性,无论是直接在 IDE 中还是通过 Jupyter Notebook,都有助于实现代码的逐步运行和调试。根据你的具体需求和环境配置,选择最适合你的方法来运行和测试 train.py

2.1 报错处理

如果出现报错信息,ModuleNotFoundError: No module named 'pygcn'

解决方法1:

  • 确保当前工作目录正确:当你在终端或命令行界面运行脚本时,确保当前目录(工作目录)是项目的根目录。你可以在执行 Python 命令之前使用 cd 命令更改目录。
    cd /你下载代码的路径
    
    注意由于是github下载的所以会出现master的文件名修改,所以各位酌情思考下这个路径修改

解决方法2:
另外一种简单粗暴的解决方式就就是你将model.py和train。py文件下的from pygcn.utils import load_data, accuracy全部修改成from utils import load_data, accuracy。删除掉pygcn,然后再次运行即可。

  1. 修改导入语句
    打开 model.pytrain.py 文件,找到所有包含 from pygcn.utils import load_data, accuracy 的导入语句。

  2. 进行修改
    将这些导入语句修改为 from utils import load_data, accuracy。这样,Python 解释器会在当前目录(或根据 PYTHONPATH 环境变量设定的路径)下寻找名为 utils 的模块而不是 pygcn.utils

  3. 保存更改
    保存你所做的更改。

  4. 重新运行脚本
    在命令行或IDE中,重新运行 train.py 脚本以检查问题是否已解决。

通过这样的修改,你可以避免包导入路径错误的问题,并且使项目结构更为简洁。这种方法非常直接,有时候对于小型或个人项目而言是最快解决问题的方式。如果将来你需要将项目部署或分享给他人,也请确保所有文件的导入路径都被适当地设置,以便他人也能顺利运行。

2.2 运行结果

代码成功的可以运行了,下面是对代码的运行结果展示:
请添加图片描述
根据输出日志,我们可以对模型的训练和测试过程进行一些基本的分析和解读:

训练结果概览

  1. 训练过程

    • Epoch 199

      • 训练集上的损失(loss_train):0.4326
      • 训练集上的准确率(acc_train):92.14%
      • 验证集上的损失(loss_val):0.7013
      • 验证集上的准确率(acc_val):83.33%
      • 耗时:0.0165秒
    • Epoch 200(最后一个训练周期):

      • 训练集上的损失:0.4208
      • 训练集上的准确率:96.43%
      • 验证集上的损失:0.6993
      • 验证集上的准确率:83.33%
      • 耗时:0.0235秒
  2. 训练结束

    • 总体耗时:2.7204秒

测试结果

  • 测试集上的损失(loss):0.7198

  • 测试集上的准确率(accuracy):83.80%

  • 从上述数据可以看出,模型在训练集上的表现逐渐改善,最后一个周期的训练准确率达到了非常高的水平(96.43%)。这表明模型在学习训练数据方面表现良好。

  • 验证集和测试集的准确率均稳定在83.33%到83.80%之间,表明模型在未见过的数据上也具有较好的泛化能力。

  • 注意到验证集的损失在训练过程的最后略有下降,这是一个良好的迹象,说明模型并未出现严重的过拟合。

此外,总体上模型的训练时间非常短(约2.7秒),这可能是因为数据集较小或模型结构较简单。如果在更大的数据集上或使用更复杂的模型结构,需要进一步评估训练时间和资源消耗。各位可以通过调整网络的结构运行不断的查看对代码进行修改找到属于自己模型。其实看过原始论文的读者一定会意外为什么这个torch版本的GCN测试结果这么好,似乎不准确,在这个的后续章节我会对这个代码问题做出解释,欢迎各位催更。

3.总结

现阶段我们已经全面介绍了模型的运行方法及GCN的理论基础。在接下来的篇章中,我们将深入探索该模型及相关论文中的核心架构和代码实现。

对于对这一主题感兴趣的读者来说,此部分将提供一个详细的技术视角,帮助您理解模型是如何从基本理论出发,通过精确的数学建模和编程实现,以达到预期的机器学习任务效果的。解析主体架构不仅对于理解模型的工作原理至关重要,对于那些希望在此基础上进行改进或自定义应用的研究者和开发者也极具价值。

如果你对此感兴趣,不妨点赞、收藏并关注,这是对我工作的最大支持和鼓励。非常感谢!如果有任何问题,欢迎随时私信我。期待与你的互动!
在这里插入图片描述

GCN(Graph Convolutional Networks,图卷积网络)是一种用于图像分类、节点分类等图像处理任务的深度学习模型。下面我将介绍如何使用PyTorch实现GCN。 首先,我们需要安装PyTorch和其它必要的库。可以使用以下命令安装: ``` pip install torch torchvision pip install numpy scipy scikit-learn ``` 接下来,我们需要定义一个GCN模型。以下是一个简单的实现: ```python import torch import torch.nn as nn import torch.nn.functional as F class GCN(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(GCN, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, output_dim) def forward(self, x, adj): x = F.relu(self.fc1(torch.mm(adj, x))) x = self.fc2(torch.mm(adj, x)) return F.log_softmax(x, dim=1) ``` 在上面的代码中,我们定义了一个三层的GCN模型。`input_dim`是输入特征的维度,`hidden_dim`是隐藏层的维度,`output_dim`是输出层的维度。`nn.Linear`是一个线性层,`F.relu`是一个激活函数,`F.log_softmax`是一个softmax函数。 接下来,我们需要定义一个训练函数。以下是一个简单的实现: ```python def train(model, optimizer, criterion, features, adj, labels, idx_train): model.train() optimizer.zero_grad() output = model(features, adj) loss = criterion(output[idx_train], labels[idx_train]) loss.backward() optimizer.step() return model, optimizer, loss.item() ``` 在上面的代码中,我们定义了一个训练函数。`features`是输入特征,`adj`是邻接矩阵,`labels`是标签,`idx_train`是训练样本的索引。我们使用`model.train()`将模型切换到训练模式,然后使用`optimizer.zero_grad()`将梯度清零,使用`model(features, adj)`计算输出,使用`criterion(output[idx_train], labels[idx_train])`计算损失,使用`loss.backward()`计算梯度,使用`optimizer.step()`更新参数。 接下来,我们需要定义一个测试函数。以下是一个简单的实现: ```python def test(model, features, adj, labels, idx_test): model.eval() output = model(features, adj) _, preds = torch.max(output, dim=1) correct = torch.sum(preds[idx_test] == labels[idx_test]) acc = correct.item() / len(idx_test) return acc ``` 在上面的代码中,我们定义了一个测试函数。`features`是输入特征,`adj`是邻接矩阵,`labels`是标签,`idx_test`是测试样本的索引。我们使用`model.eval()`将模型切换到测试模式,然后使用`model(features, adj)`计算输出,使用`torch.max`计算最大值,使用`torch.sum`计算正确的预测数量,使用`acc = correct.item() / len(idx_test)`计算准确率。 以下是一个完整的GCN模型的实现: ```python import torch import torch.nn as nn import torch.nn.functional as F class GCN(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(GCN, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, output_dim) def forward(self, x, adj): x = F.relu(self.fc1(torch.mm(adj, x))) x = self.fc2(torch.mm(adj, x)) return F.log_softmax(x, dim=1) def train(model, optimizer, criterion, features, adj, labels, idx_train): model.train() optimizer.zero_grad() output = model(features, adj) loss = criterion(output[idx_train], labels[idx_train]) loss.backward() optimizer.step() return model, optimizer, loss.item() def test(model, features, adj, labels, idx_test): model.eval() output = model(features, adj) _, preds = torch.max(output, dim=1) correct = torch.sum(preds[idx_test] == labels[idx_test]) acc = correct.item() / len(idx_test) return acc ``` 接下来,我们需要加载数据。以下是一个简单的实现: ```python import numpy as np def load_data(): adj = np.array([[0, 1, 1, 0], [1, 0, 1, 0], [1, 1, 0, 1], [0, 0, 1, 0]]) features = np.array([[0, 1, 0], [1, 0, 0], [0, 0, 1], [1, 0, 0]]) labels = np.array([0, 1, 2, 0]) idx_train = np.array([0, 1, 2]) idx_test = np.array([3]) return adj, features, labels, idx_train, idx_test ``` 在上面的代码中,我们定义了一个简单的图。`adj`是邻接矩阵,`features`是输入特征,`labels`是标签,`idx_train`是训练样本的索引,`idx_test`是测试样本的索引。 接下来,我们需要训练模型。以下是一个简单的实现: ```python import torch.optim as optim adj, features, labels, idx_train, idx_test = load_data() model = GCN(input_dim=features.shape[1], hidden_dim=16, output_dim=labels.max()+1) optimizer = optim.Adam(model.parameters(), lr=0.01) criterion = nn.CrossEntropyLoss() for epoch in range(100): model, optimizer, loss = train(model, optimizer, criterion, features, adj, labels, idx_train) acc = test(model, features, adj, labels, idx_test) print('Epoch: {:03d}, Loss: {:.4f}, Acc: {:.4f}'.format(epoch, loss, acc)) ``` 在上面的代码中,我们定义了一个优化器和一个损失函数。然后,我们使用一个循环来训练模型,并使用`test`函数测试模型。我们使用`print`函数打印训练和测试的损失和准确率。 以上就是使用PyTorch实现GCN的一些基本步骤。当然,这只是一个简单的实现,实际中还有很多需要改进的地方。希望能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个男人是小帅

请小弟喝杯咖啡☕️鼓励下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值