JK-Nets实验记录

1、准备工作

按照JK-Nets的paper中的划分方式,训练集(60%) 、验证集(20%)、测试集(20%)。

数据集划分(数量)训练集(60%)验证集(20%)测试集(20%)
Cora1624542542
Citeseer1995666666
Pubmed1182939443944

超参数也严格遵循了paper中的取值。

超参数等训练因素取值/范围
loss_funcNLLLoss
optimizerAdam
lr0.005
dropout0.5
hidden_dim16
weight_decay5e-4
epoch100

2、实验结果

找了半天发现github上基本没有JK-Nets的代码,好不容易找到一份PyTorch实现的,还是使用了dgl,看来只能自己动手丰衣足食了。。
参考的代码(DGL):https://github.com/mori97/JKNet-dgl
我的复现代码(PyG):https://github.com/ytchx1999/PyG-JK-Nets

Cora

下面是按照paper中的数据集划分方式,训练100个epoch得出的实验结果,JK-Nets使用的base model是GCNConv。
和paper中的实验结果相比,所有参与实验的模型整体上准确率都提高了,猜测可能是PyG中实现的GCNConv层优化的比较好。
也不难发现,按照这种划分,JK-Nets确实比baseline有了一定的提升,max和concat的差异不大。并且JK-Nets是6层的模型,这也打破了baseline只能是2-3层的现实,也为后续增加模型的深度提供了一种思路。

模型Cora
GCN(2层)0.934
GAT(2层)0.924
JK-Maxpool(6层)0.944
JK-Concat(6层)0.948

在这里插入图片描述
查看训练不同的epoch对模型准确率的影响。

训练的epochJK-Concat-Cora
1000.946
2000.964
5000.978
10000.985
20000.991

按照标准的数据集划分的结果(140、500、1000),训练集的数量相差11.6倍,测试集准确率不升反降。原因可能是图本身就比较小,标准划分方式的训练集又很小,导致JK-Nets的学习能力受到了限制,效果反而不如GCN。

模型Cora
GCN(2层)0.803
GAT(2层)0.802
JK-Maxpool(6层)0.768
JK-Concat(6层)0.783

Citeseer

模型Citeseer
GCN(2层)0.907
GAT(2层)0.873
JK-Maxpool(6层)0.929
JK-Concat(6层)0.924

在这里插入图片描述

Pubmed

原文没有做关于Pubmed的实验。

模型Pubmed
GCN(2层)0.857
GAT(2层)0.859
JK-Maxpool(6层)0.869
JK-Concat(6层)0.871
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 用 Java 实现根据 cp-nets 生成 cp-nets 导出的方法如下: 1. 读取 cp-nets 的数据结构,包括点和边的信息。 2. 建立一个新,用于存储 cp-nets 导出。 3. 根据 cp-nets 的点和边的信息,在新中创建点和边。 4. 应用 cp-nets 导出算法,在新中生成 cp-nets 导出。 5. 输出 cp-nets 导出的数据结构。 下面是一个简单的实现示例: ``` import java.util.ArrayList; import java.util.List; public class CPNet { private List<Node> nodes; private List<Edge> edges; public CPNet(List<Node> nodes, List<Edge> edges) { this.nodes = nodes; this.edges = edges; } public List<Node> getNodes() { return nodes; } public List<Edge> getEdges() { return edges; } public static class Node { private String name; public Node(String name) { this.name = name; } public String getName() { return name; } } public static class Edge { private Node source; private Node target; public Edge(Node source, Node target) { this.source = source; this.target = target; } public Node getSource() { return source; } public Node getTarget() { return target; } } public CPNet export() { List<Node> exportedNodes = new ArrayList<>(); List<Edge> exportedEdges = new ArrayList<>(); // Apply export algorithm to generate exported graph return new CPNet(exportedNodes, exportedEdges); } public static void main(String[] args) { List<Node> nodes = new ArrayList<>(); nodes.add(new Node("A")); nodes.add(new Node("B")); nodes.add(new Node("C")); List<Edge> edges = new ArrayList<>(); edges.add(new Edge(nodes.get(0), nodes.get(1))); edges.add(new Edge(nodes.get(1), nodes.get(2))); CPNet cpNet = new CPNet(nodes, edges); ### 回答2: CP-nets(条件偏好网络)是一种用于表示个体偏好关系的形模型。根据CP-nets生成CP-nets导出,可以使用Java编程语言实现。 首先,我们需要定义一个CP-nets的数据结构,可以使用邻接矩阵表示法或邻接链表表示法。假设我们使用邻接链表来表示CP-nets,其中每个节点表示一个条件偏好关系。 接下来,我们可以使用Java的形化库(比如JavaFX或Swing)来绘制CP-nets导出。我们可以根据CP-nets的数据结构,在形界面上绘制节点和边,以表示条件偏好关系。 具体步骤如下: 1. 创建一个Java项目,并引入形化库所需的依赖。 2. 设计CP-nets的数据结构,可以包括节点类和边类。节点类应包含节点的属性,如名称、偏好值等。边类应包含边的属性,如起始节点、结束节点等。 3. 实现CP-nets的读取功能,可以从文件中读取CP-nets的数据,或者通过用户输入获取。 4. 使用形化库创建一个窗口,作为CP-nets导出的界面。 5. 将CP-nets的节点和边在界面上绘制出来。可以根据节点的位置、大小和偏好值等属性来绘制节点,使用合适的线条来连接相邻节点。 6. 添加交互功能,比如点击节点展开或关闭其下级节点。 7. 运行程序,根据输入的CP-nets数据,显示出CP-nets导出。 通过上述步骤,我们可以使用Java实现根据CP-nets得到CP-nets导出的功能。编写并运行程序后,我们可以在形界面上直观地观察和分析CP-nets的结构和偏好关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值