Python如何创建1000个图的数据集并解决训练类型不匹配报错
问题排查与修复方案
错误原因
- 报错
RuntimeError: expected scalar type Float but found Long的核心触发原因是:你生成的节点特征x、边属性edge_attr都指定为LongTensor整数类型,但PyTorch神经网络中的线性层参数默认是浮点类型,两类数据类型不匹配导致计算报错。 - 如果你当前做的是节点分类任务,标签
y使用LongTensor类型是合理的,不需要调整。
修复后的1000个图数据集生成代码
import numpy as np import torch from torch_geometric.data import Data from random import randint data_list = [] ngraphs = 1000 for i in range(ngraphs): num_nodes = randint(10,500) num_edges = randint(10, num_nodes*(num_nodes - 1)) f1 = np.random.randint(10, size=(num_nodes)) f2 = np.random.randint(10,20, size=(num_nodes)) f3 = np.random.randint(20,30, size=(num_nodes)) f_final = np.stack((f1,f2,f3), axis=1) capital = 2*f1 + f2 - f3 capital_t = torch.from_numpy(capital) # 分类任务标签保留LongTensor即可,回归任务可修改为FloatTensor capital_t = capital_t.type(torch.LongTensor) x = torch.from_numpy(f_final) # 节点特征修改为浮点类型,匹配网络参数类型 x = x.type(torch.FloatTensor) edge_index = torch.randint(low=0, high=num_nodes, size=(num_edges,2), dtype=torch.long) edge_attr = torch.randint(low=0, high=50, size=(num_edges,1), dtype=torch.long) # 边属性修改为浮点类型,若你的GNN模型不需要用到边属性可跳过该修改 edge_attr = edge_attr.type(torch.FloatTensor) data = Data(x = x, edge_index = edge_index.t().contiguous(), y = capital_t, edge_attr=edge_attr ) data_list.append(data)
补充说明
- GPU训练时需要保证网络、输入特征、标签都在同一个设备上,可统一调用
.to(device)处理。 - 如果是回归任务,将
capital_t的类型也改为torch.FloatTensor即可。
内容的提问来源于stack exchange,提问作者riskiem
相关产品推荐
相关产品推荐

