【torch】搭建GCN的详细介绍

一、GCN的原理

简单,也有很多博客在说明!
链接1:https://arxiv.org/abs/1609.02907
链接2:https://mp.weixin.qq.com/s/DJAimuhrXIXjAqm2dciTXg

二、GCN的层代码

import math
import torch
from torch.nn.parameter import Parameter
from torch.nn.modules.module import Module
class GraphConvolution(Module):
    def __init__(self, in_features, out_features, bias=True):
        super(GraphConvolution, self).__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.weight = Parameter(torch.FloatTensor(in_features, out_features))
        if bias:
            self.bias = Parameter(torch.FloatTensor(out_features))
        else:
            self.register_parameter('bias', None)
        self.reset_parameters()

    def reset_parameters(self):
        stdv = 1. / math.sqrt(self.weight.size(1))
        self.weight.data.uniform_(-stdv, stdv)
        if self.bias is not None:
            self.bias.data.uniform_(-stdv, stdv)

    def forward(self, input, adj):
        support = torch.mm(input, self.weight)
        output = torch.spmm(adj, support)
        if self.bias is not None:
            return output + self.bias
        else:
            return output

    def __repr__(self):
        return self.__class__.__name__ + ' (' \
               + str(self.in_features) + ' -> ' \
               + str(self.out_features) + ')'

解释说明:

  1. class GraphConvolution(Module):继承Module类。

  2. class GraphConvolution(Module)中有两个恒常在的函数:__init__()用于初始化参数或者模块等;forward()函数属于输入变量并做运算。

  3. def __init__(self, in_features, out_features, bias=True)这个函数中:

    • super(GraphConvolution, self).__init__():是按照 GraphConvolution的父类Module的初始化方式进行初始化。
    • self.in_features = in_features:用来定义初始化变量,可以在整个class的任意一个函数内部使用。
    • self.weight = Parameter(torch.FloatTensor(in_features, out_features)):定义新的初始化变量。模型中的参数,它是Parameter()类,也是定义GCN的核心操作之一。
      在这里插入图片描述
  4. forward(self, input, adj)函数中输入变量input,adj.

    • support = torch.mm(input, self.weight) 是矩阵乘法,input * self.weight.注意到torch.mm使用范围仅限于二维矩阵。当存在batch变量的时候,也就是infut.shape=[B, N, F]三维形状的时候不使用。建议改为torch.matmul.
    • output = torch.spmm(adj, support)也是矩阵乘法。adj是我们的矩阵输入变量,具有N*N个元素,通常情况下采用稀疏矩阵来保存。spmm是稀疏矩阵的乘法:
      支持 sparse 在前,dense 在后的矩阵乘法
      两个sparse相乘或者dense在前的乘法不支持,
      当然两个dense矩阵相乘是支持的.
      mm是二维矩阵的乘法,不适合用于三维矩阵。
  5. reset_parameters(self)是参数初始化

    • self.weight.size(1)是weight的形状(in_features, out_features)中的out_features
    • math.sqrt(4)=2.0是返回平方根
    • self.weight.data.uniform_(-stdv, stdv):是指weight.data按照均匀分布,上限为-stdv,下限位stdv.
    • 此外对weight的数据初始化方法还有另外一种:init.kaiming_uniform_(self.weight)
  6. __repr__(self)返回该clas的一些介绍。比如
    在这里插入图片描述

三、GCN的搭建

import torch.nn as nn
import torch.nn.functional as F
from pygcn.layers import GraphConvolution
class GCN(nn.Module):
    def __init__(self, nfeat, nhid, nclass, dropout):
        super(GCN, self).__init__()
        self.gc1 = GraphConvolution(nfeat, nhid)
        self.gc2 = GraphConvolution(nhid, nclass)
        self.dropout = dropout
    def forward(self, x, adj):
        x = F.relu(self.gc1(x, adj))
        x = F.dropout(x, self.dropout, training=self.training)
        x = self.gc2(x, adj)
        return F.log_softmax(x, dim=1)
  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GCN (Graph Convolutional Networks) 是一种用于图数据的深度学习模型,而 torch_geometric 是一个基于 PyTorch 的图神经网络库,提供了实现 GCN 的工具和函数。 要使用 torch_geometric 实现 GCN,首先需要安装 torch_geometric 库。可以通过以下命令使用 pip 进行安装: ``` pip install torch_geometric ``` 安装完成后,可以按照以下步骤实现 GCN: 1. 导入所需的库和模块: ```python import torch import torch.nn.functional as F from torch_geometric.nn import GCNConv ``` 2. 创建 GCN 模型类: ```python class GCN(torch.nn.Module): def __init__(self, num_features, num_classes): super(GCN, self).__init__() self.conv1 = GCNConv(num_features, 16) # 输入特征数为 num_features,输出特征数为 16 self.conv2 = GCNConv(16, num_classes) # 输入特征数为 16,输出特征数为 num_classes def forward(self, x, edge_index): x = self.conv1(x, edge_index) x = F.relu(x) x = F.dropout(x, training=self.training) x = self.conv2(x, edge_index) return F.log_softmax(x, dim=1) ``` 3. 创建数据集和加载数据: ```python from torch_geometric.datasets import Planetoid dataset = Planetoid(root='/tmp/Cora', name='Cora') data = dataset[0] ``` 4. 创建模型实例和优化器: ```python model = GCN(dataset.num_features, dataset.num_classes) optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4) ``` 5. 训练模型: ```python def train(): model.train() optimizer.zero_grad() output = model(data.x, data.edge_index) loss = F.nll_loss(output[data.train_mask], data.y[data.train_mask]) loss.backward() optimizer.step() for epoch in range(200): train() ``` 这是一个简单的 GCN 实现示例,可以根据具体需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值