Skip to content

Fix #5749: GINDataset 数据类型错误#7923

Open
Whning0513 wants to merge 1 commit into
dmlc:masterfrom
Whning0513:fix-issue-5749
Open

Fix #5749: GINDataset 数据类型错误#7923
Whning0513 wants to merge 1 commit into
dmlc:masterfrom
Whning0513:fix-issue-5749

Conversation

@Whning0513

Copy link
Copy Markdown

Fix #5749

问题描述

Issue #5749:
GINDataset 在加载图数据时抛出异常:

DGLError: Expect argument "u" to have data type int32 or int64, but got torch.float32.

当使用 GINDataset("MUTAG", self_loop=True, degree_as_nlabel=False) 时触发。

根因分析

问题 1: 条件判断方向错误(主要 bug)

原代码第 224 行:

elif tmp > len(nrow):

当节点具有额外属性(attributes)时,实际 len(nrow) > tmp(即 tmp < len(nrow)),
但原代码使用了 > 运算符,导致正确的属性数据不会被解析为 node attributes,
而是被当作相邻节点索引的一部分传入 g.add_edges(j, nrow[2:])
这些属性数据是浮点型,传入后 DGL 期望整数类型的节点 ID,从而导致类型断言失败。

问题 2: 节点标签未指定数据类型

原代码第 260 行:

g.ndata["label"] = F.tensor(nlabels)

未显式指定 dtypenlabels 是 Python 整数列表,PyTorch 在某些平台(如 FreeBSD)
上可能将其推断为 float32 而非 int64,导致 DGL 内部类型检查失败。

问题 3: 图标签未指定数据类型

原代码第 272 行:

self.labels = F.tensor(self.labels)

同问题 2,未显式指定 dtype,存在跨平台类型推断不确定性。

修改内容

行号 原代码 修改后 说明
224 elif tmp > len(nrow): elif tmp < len(nrow): 修正条件判断方向,正确识别节点属性
225 (无注释) # has node attributes 增加注释说明此分支含义
260 F.tensor(nlabels) F.tensor(nlabels, F.int64) 显式指定节点标签为 int64 类型
272 F.tensor(self.labels) F.tensor(self.labels, F.int64) 显式指定图标签为 int64 类型

文件清单

  • gindt.py — 修改后的完整源文件
  • patch.diff — 统一格式的补丁文件
  • README.md — 本说明文件

参考资料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

GINDataset is broken: dgl._ffi.base.DGLError: Expect argument "u" to have data type int32 or int64, but got torch.float32

1 participant