【图神经网络】手把手带你快速上手OpenHGNN

1. 评估新的数据集

如果需要,可以指定自己的数据集。本节中,我们使用HGBn-ACM作为节点分类数据集的示例。

1.1 如何构建一个新的数据集

第一步:预处理数据集
这里给出了一个处理HGBn-ACM的演示,这是一个节点分类数据集

首先,下载HGBn-ACM数据集:HGB数据集。下载完成后,需要将其处理为一个dgl.heterograph

以下代码片段是在DGL中创建异构图的示例。

import dgl
import torch as th

graph_data = {
    ('drug','interacts', 'drug'): (th.tensor([0,1]), th.tensor([1,2])),
    ('drug','interacts', 'gene'): (th.tensor([0,1]), th.tensor([2,3])),
    ('drug','treats','disease'): (th.tensor([1]), th.tensor([2]))
}
graph_data

graph_data
canonical_etypes
推荐将feature name设置为h

g.nodes['drug'].data['h'] = th.ones(3, 1)

DGL提供了dgl.save_graphs()dgl.load_graphs()分别表示保存和加载二进制形式的异质图。因此,这里使用dgl.save_graphs保存graphs到磁盘中:

dgl.save_graphs('demo_graph.bin',g)

第二步:增加额外的信息
经过第一步,得到一个demo_graph.bin的二进制文件,然后我们将其移动到openhgnn/dataset/目录下,下一步的具体信息在NodeClassificationDataset.py

例如,我们将category,num_classes和multi_label(if necessary) 设置为paper3True,分别表示要预测类的节点类型、类的数量以及任务是否为多标签分类。有关详细信息,请参阅基本节点分类数据集。
加载dgl
增加额外的信息:

if name_dataset == 'demo_graph':
    data_path = './openhgnn/dataset/demo_graph.bin'
    g, _ = load_graphs(data_path)
    g = g[0].long()
    self.category = 'author'  # 增加额外的信息
    self.num_classes = 4
    self.multi_label = False

第三步:可选
使用demo_graph作为数据集,评估一个存在的模型:

python main.py -m GTN -d demo_graph -t node_classification -g 0 --use_best_config

如果有另一个数据集名称,那需要修改代码build_dataset

2. 使用一个新的模型

这一部分,我们创建一个模型,名为RGAT,它不在我们的模型package <api-model>。

2.1 如何构建一个新模型

第一步:注册器模型
我们创建一个继承基本模型(Base Model)的类RGAT,并使用@register_model(str)注册该模型。

from openhgnn.models import BaseModel, register_model
@register_model('RGAT')
class RGAT(BaseModel):
    ...

第二步:实现函数
必须实现类方法build_model_from_args,其他函数像__init__,forward

...
class RGAT(BaseModel):
    @classmethod
    def build_model_from_args(cls, args, hg):
        return cls(in_dim=args.hidden_dim,
                   out_dim=args.hidden_dim,
                   h_dim=args.out_dim,
                   etypes=hg.etypes,
                   num_heads=args.num_heads,
                   dropout=args.dropout)

    def __init__(self, in_dim, out_dim, h_dim, etypes, num_heads, dropout):
        super(RGAT, self).__init__()
        self.rel_names = list(set(etypes))
        self.layers = nn.ModuleList()
        self.layers.append(RGATLayer(
            in_dim, h_dim, num_heads, self.rel_names, activation=F.relu, dropout=dropout))
        self.layers.append(RGATLayer(
            h_dim, out_dim, num_heads, self.rel_names, activation=None))
        return

    def forward(self, hg, h_dict=None):
        if hasattr(hg, 'ntypes'):
            # full graph training,
            for layer in self.layers:
                h_dict = layer(hg, h_dict)
        else:
            # minibatch training, block
            for layer, block in zip(self.layers, hg):
                h_dict = layer(block, h_dict)
        return h_dict

这里我们没有给出RGATLayer的实现细节。有关更多阅读,请查看:RGATLayer
在OpenHGNN中,我们在模型之外对数据集的特征进行预处理。具体来说,使用每个节点类型都有偏差的线性层来将所有节点特征映射到共享特征空间。因此,模型中forward的参数h_dict不是原始特征,您的模型不需要进行特征预处理。
第三步:添加到支持的模型字典
我们应该在 model/init.py中向 SUPPORTED _ MODELS 添加一个新条目。

3. 应用到一个新场景

在本节中,我们将应用于一个推荐场景,该场景涉及构建一个新任务和训练流。

3.1 如何构建一个新任务

第一步:注册任务
创建一个类Recommendation,继承内置的BaseTask并用@register_task(str)注册它。

from openhgnn.tasks import BaseTask, register_task
@register_task('recommendation')
class Recommendation(BaseTask):
    ...

第二步:实现方法
我们应该实现与评估指标和损失函数相关的方法。

class Recommendation(BaseTask):
    """Recommendation tasks."""
    def __init__(self, args):
        super(Recommendation, self).__init__()
        self.n_dataset = args.dataset
        self.dataset = build_dataset(args.dataset, 'recommendation')
        self.train_hg, self.train_neg_hg, self.val_hg, self.test_hg = self.dataset.get_split()
        self.evaluator = Evaluator(args.seed)

    def get_loss_fn(self):
        return F.binary_cross_entropy_with_logits

    def evaluate(self, y_true, y_score, name):
        if name == 'ndcg':
            return self.evaluator.ndcg(y_true, y_score)

最后
task/init.py中,增加一个新的实体到SUPPORTED_TASKS.

3.2 如何构建一个新的trainerflow

第一步:注册trainerflow
创建一个类,继承BaseFlow,并用@register_trainer(str)去注册trainerflow。

from openhgnn.trainerflow import BaseFlow, register_flow
@register_flow('Recommendation')
class Recommendation(BaseFlow):
    ...

第二步:实现方法
我们将函数train()声明为一个抽象方法。因此,train()必须被重写,否则trainerflow就无法实例化。下面给出了一个训练循环的示例。

...
class Recommendation(BaseFlow):
    def __init__(self, args=None):
        super(Recommendation, self).__init__(args)
        self.target_link = self.task.dataset.target_link
        self.model = build_model(self.model).build_model_from_args(self.args, self.hg)
        self.evaluator = self.task.get_evaluator(self.metric)

    def train(self,):
        for epoch in epoch_iter:
            self._full_train_step()
            self._full_test_step()

    def _full_train_step(self):
        self.model.train()
        logits = self.model(self.hg)[self.category]
        loss = self.loss_fn(logits[self.train_idx], self.labels[self.train_idx])
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()
        return loss.item()

    def _full_test_step(self, modes=None, logits=None):
        self.model.eval()
        with torch.no_grad():
            loss = self.loss_fn(logits[mask], self.labels[mask]).item()
            metric = self.task.evaluate(pred, name=self.metric, mask=mask)
            return metric, loss

最终
trainerflow/init.py中增加一个新的实体到SUPPORT_FLOWS

内容来源

  1. Developer_Guide
### 关于 HGNN 的代码实现与教程 #### 基于 OpenHGNN 的异构图神经网络实现 OpenHGNN 是由北京邮电大学 GAMMA 实验室开发的一个高效、灵活的开源框架,专为处理异构图数据而设计。它提供了一系列工具和模块来帮助研究人员快速搭建并测试不同的异构图神经网络模型[^2]。 以下是使用 OpenHGNN 构建一个简单的异构图神经网络的例子: ```python import torch from openhgnn.models import HetGNN from openhgnn.dataset import ACMDataset # 加载数据集 dataset = ACMDataset() graph = dataset.graph # 初始化模型 model = HetGNN(graph, hidden_dim=64) # 定义优化器 optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 训练过程 def train(): model.train() logits = model(graph) loss = model.compute_loss(logits, graph['labels']) optimizer.zero_grad() loss.backward() optimizer.step() for epoch in range(10): train() ``` 上述代码展示了如何通过 OpenHGNN 来加载数据集、初始化模型以及完成基本的训练循环。 --- #### HiGPT 中的异构图神经网络实现 HiGPT 提供了一种全新的视角来看待异构图上的语言建模任务,并且支持多种最新的异构图学习方法。如果希望尝试更复杂的异构图神经网络结构,可以参考 HiGPT 所涉及的技术栈及其对比实验中的具体实现方式[^3]。 下面是一个基于 PyTorch 和 DGL (Deep Graph Library) 的简单 HeteroGraphConv 层实现示例: ```python import dgl import torch.nn as nn import torch.nn.functional as F class SimpleHGNLayer(nn.Module): def __init__(self, in_feats, out_feats): super(SimpleHGNLayer, self).__init__() self.fc_dict = nn.ModuleDict({ rel: nn.Linear(in_feats, out_feats) for rel in ['rel1', 'rel2'] }) def forward(self, g, h): with g.local_scope(): funcs = {} for srctype, etype, dsttype in g.canonical_etypes: Wh = self.fc_dict[etype](h[srctype]) g.nodes[srctype].data[f'Wh_{srctype}'] = Wh g.update_all(dgl.function.copy_u(f'Wh_{srctype}', 'm'), dgl.function.sum('m', 'h'), etype=etype) funcs[dsttype] = lambda nodes: {'h': F.relu(nodes.data['h'])} g.multi_update_all(funcs, 'sum') return {ntype: g.nodes[ntype].data['h'] for ntype in g.ntypes} # 使用示例 g = ... # 创建一个异构图实例 layer = SimpleHGNLayer(in_feats=10, out_feats=20) output = layer(g, input_features) ``` 此代码片段定义了一个基础的异构图卷积层 `SimpleHGNLayer` 并演示了其应用。 --- #### 学术推荐算法 GARec 的实现思路 GARec 是一种基于图神经网络的学术推荐算法,在其实现过程中采用了多层 GNN 结构来进行节点嵌入的学习。虽然完整的源码可能需要额外获取,但可以根据已有理论重新构建类似的架构[^1]。 以下是一个简化的 GARec 风格的实现方案: ```python import numpy as np import networkx as nx import tensorflow as tf # 构造异构图 G = nx.Graph() G.add_nodes_from([f'u{i}' for i in range(5)], type='user') # 用户节点 G.add_nodes_from([f'i{j}' for j in range(7)], type='item') # 物品节点 edges = [('u0', 'i0'), ('u0', 'i1'), ..., ('u4', 'i6')] G.add_edges_from(edges) # 转换为邻接矩阵形式 A = nx.to_numpy_array(G) # 定义 GCN 模型 class GCN(tf.keras.Model): def __init__(self, num_layers, input_dim, output_dim): super(GCN, self).__init__() self.layers_list = [ tf.keras.layers.Dense(output_dim, activation='relu') for _ in range(num_layers)] def call(self, inputs): x = inputs for dense_layer in self.layers_list[:-1]: x = dense_layer(x) outputs = self.layers_list[-1](x) return outputs # 输入特征向量 features = np.random.randn(A.shape[0], input_dim).astype(np.float32) # 初始化模型 input_dim = features.shape[1] output_dim = 8 num_layers = 2 model = GCN(num_layers=num_layers, input_dim=input_dim, output_dim=output_dim) # 推荐预测逻辑... ``` 这段代码展示了一个基于 TensorFlow 的简单版本 GARec 框架,其中包含了用户-物品交互关系的建模。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

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

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

打赏作者

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

抵扣说明:

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

余额充值