原帖在 DataLoader 默认 collate 中失败;还没有进入循环体,也没有调用模型:
TypeError: batch must contain tensors, numbers, dicts or lists; found object
组批发生在循环体之前
原题在 default_collate 递归处理字段时发现 object 类型,此时还未得到 data、target,更没有执行模型。优先绕过 DataLoader 读取单项,再检查哪个字段是 object;更改模型输入层不会改变 Dataset 返回值。
报错的 object 常见于 NumPy object 数组:里面可能是字符串、不等长数组或自定义对象。DataLoader 不负责猜测这些对象该怎样变成规则数值 batch。
设 molecules 是原题传入 DataLoader 的数据集,先绕过 loader 检查一项:
sample = molecules[0]
print("josh050608")
print("sample type:", type(sample))
for i, value in enumerate(sample if isinstance(sample, (tuple, list)) else [sample]):
print(i, type(value), getattr(value, "shape", None), getattr(value, "dtype", None))
若发现某个 NumPy 数组的 dtype 为 object,再检查其中几项的类型和尺寸。若只是规则数值被错误装进 object 数组,应在 Dataset.getitem 中明确转换成数值 ndarray/Tensor;分类标签单独转成合法类别索引。
若每个分子是不同节点数的图,不能靠 astype(float) 或 torch.stack 强行组批。需要按图模型的约定合并节点/边并记录图归属,或按序列任务定义 padding、长度和 mask,然后编写对应 collate_fn。原帖没有给出 molecules 结构,无法替它指定唯一的组批规则。
先用 num_workers=0 得到完整错误链,验证 dataset[0],再验证两个样本组成一个 batch。组批通过后,batch_idx 是 enumerate 产生的 Python 整数,没有 .shape;应打印 data.shape 或实际字段形状。
完成标准是每个 batch 的字段、尺寸和样本归属符合模型输入,而不只是把 TypeError 捕获后继续训练。
规则数值与变长对象要分两条路
下面的 CPU 合成例子演示规则数值如何在数据入口转换,并展示变长对象为什么要先检查长度。它不定义分子图的组批协议:
import numpy as np
import torch
from torch.utils.data import TensorDataset, DataLoader
raw = np.array([[1., 2.], [3., 4.]], dtype=object)
numeric = raw.astype(np.float32)
dataset = TensorDataset(torch.from_numpy(numeric), torch.tensor([0, 1]))
x, y = next(iter(DataLoader(dataset, batch_size=2)))
assert x.shape == (2, 2) and x.dtype == torch.float32
assert y.tolist() == [0, 1]
ragged = np.empty(2, dtype=object)
ragged[0], ragged[1] = np.arange(2), np.arange(3)
print("regular batch:", x.shape)
print("ragged lengths:", [len(item) for item in ragged])
assert len({
len(item) for item in ragged}) != 1
规则数据只有确认每个值都能按任务解释为数值后才转换;字符串类别要编码,文本输入要分词,不能统统 astype(float)。变长序列需要 padding、长度或 mask;分子图通常需要节点、边与图归属的专门协议,普通 stack 无法替你定义它。
可先从 dataset 取两个样本,直接调用准备采用的 collate_fn,查看返回字段与样本数量。不要用“丢弃异常样本”或把整个对象列表交给模型来掩盖数据定义缺失。
验收包括样本 ID、目标与变长结构仍正确配对,模型确实能消费组批结果。组批通过后再处理原题 batch_idx.shape 这类独立错误:enumerate 的序号是整数,应查看真实 data 字段。
参考:原始求助帖;技术依据:PyTorch 数据加载(2.5)、torch.from_numpy(2.5)。