GCN-图卷积神经网络算法简单实现(含python代码)

本文是就实现GCN算法模型进行的代码介绍,上一篇文章是GCN算法的原理和模型介绍。

代码中用到的Cora数据集:

链接:https://pan.baidu.com/s/1SbqIOtysKqHKZ7C50DM_eA 
提取码:pfny 

文章目录

目的

一、数据集介绍

二、实现过程讲解

三、代码实现和结果分析

1. 导入包

2. 数据准备¶

3. 图卷积层定义

4. GCN图卷积神经网络模型定义

5. 模型训练

5.1 超参数定义,包含学习率、正则化系数等。

5.2 定义模型:

5.3 定义训练和测试函数,进行训练

6. 可视化


目的

本次实验的目的是将论文分类,通过模型训练,利用已经分好类的训练集,将论文通过GCN算法分为7类。


一、数据集介绍

数据集我选用的是GCN常用的Cora数据集,实验的目标就是通过对构造出来的两层GCN模型进行训练,实现对数据集样本节点的分类

Cora数据集下载地址:https://linqs-data.soe.ucsc.edu/public/lbc/cora.tgz

个人不建议用python的dgl包中的Cora数据,总是报错。

Cora数据集由关于机器学习方面的论文组成。 这些论文分为以下七个类别之一:

1.基于案例

2.遗传算法

3.神经网络

4.概率方法

5.强化学习

6.规则学习

7.理论

这些论文都是经过筛选的,在最终的数据集中,每篇论文引用或被至少一篇其他论文引用。整个语料库中有2708篇论文。

在词干堵塞和去除词尾后,只剩下1433个唯一的单词。文档频率小于10的所有单词都被删除。

即Cora数据集包含2708个顶点, 5429条边,每个顶点包含1433个特征,共有7个类别。

并且Cora已经把训练集和测试集的数据都划分好了,直接按照文件名读取数据即可,如

文件ind.cora.x => 训练实例的特征向量;ind.cora.y => 训练实例的标签,独热编码

ind.cora.tx => 测试实例的特征向量;ind.cora.ty => 测试实例的标签,独热编码

二、实现过程讲解

结合我最后做的代码实现,给大家先举一个引文网络的简单实例,方便大家了解处理过程。

其中每个节点代表一篇研究论文,同时边代表的是引用关系。

我们在这里有一个预处理步骤。在这里我们不使用原始论文作为特征,而是将论文转换成向量(通过使用NLP嵌入,例如tf-idf)。

假设我们使用average()函数(实际上GCN内部的传递函数肯定不是平均值,这里只是方便理解)。我们将对所有的节点进行同样的获取特征向量的操作。最后,我们将这些计算得到的平均值输入到神经网络中。

让我们考虑下绿色节点。首先,我们得到它的所有邻居的特征值,包括自身节点,接着取平均值。最后通过神经网络返回一个结果向量并将此作为最终结果。请注意,在GCN中,我们仅仅使用一个全连接层。在这个例子中,我们得到2维向量作为输出(全连接层的2个节点)。

全连接网络的作用就是对上一层得到的向量做乘法,最终降低其维度,然后输入到softmax层中得到对应的每个类别的得分。

在实际操作中,我们肯定是使用比average函数更复杂的聚合函数,也就是上面讲的那个传播函数。

我们还可以将更多的层叠加在一起,以获得更深的GCN。其中每一层的输出会被视为下一层的输入。

2层GCN的例子:第一层的输出是第二层的输入。

那么两层的GCN就可以在降维的同时,通过层间传播的公式获取到二阶邻居节点的特征:

 在节点分类问题中,实际上在输入的邻接矩阵和每个节点的特征中,既包含了节点间的联系情况,也包含了节点自身的特征。

通过GCN的卷积层就可以实现降维,想要聚成几类就降成几维。

三、代码实现和结果分析

1. 导入包

import itertools
import os
import os.path as osp
import pickle
import urllib
from collections import namedtuple
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import scipy.sparse as sp
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.nn.init as init
import torch.optim as optim
import matplotlib.pyplot as plt
%matplotlib inline

2. 数据准备

Data = namedtuple('Data', ['x', 'y', 'adjacency',
                           'train_mask', 'val_mask', 'test_mask'])


def tensor_from_numpy(x, device):
    return torch.from_numpy(x).to(device)


class CoraDa
卷积神经网络是一种经典的深度学习算法,用于图像分类、目标检测等任务。Python是一种非常流行的编程语言,拥有丰富的深度学习库,如Tensorflow、PyTorch等,这些库提供了丰富的卷积神经网络模型和优化算法。以下是一个简单Python卷积神经网络代码示例,用于识别手写数字: ``` import tensorflow.keras as keras from tensorflow.keras.datasets import mnist # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 对输入数据进行归一化和预处理 x_train = x_train.reshape((x_train.shape[0], 28, 28, 1)) / 255.0 x_test = x_test.reshape((x_test.shape[0], 28, 28, 1)) / 255.0 y_train = keras.utils.to_categorical(y_train) y_test = keras.utils.to_categorical(y_test) # 创建卷积神经网络模型 model = keras.Sequential() model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(keras.layers.MaxPooling2D((2, 2))) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(64, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax')) # 编译模型并训练 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5, batch_size=64, validation_data=(x_test, y_test)) # 在测试集上评估模型性能 test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc) ``` 该示例使用了Keras库,加载MNIST数据集进行模型训练和测试,首先对输入数据进行归一化和预处理,然后创建一个包卷积层、池化层、全连接层的卷积神经网络模型。接着编译模型指定优化器和损失函数,使用训练数据训练模型,最后在测试集上评估模型性能。该示例使用了relu激活函数、softmax激活函数,Adam优化器,批量大小为64,共迭代5次。
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值