You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch创建TensorDataset报错:'numpy.int32' object is not callable

报错根因

这个报错和张量维度、dtype没有关系,核心是你传入torch.utils.data.TensorDataset的根本不是PyTorch张量,是TensorFlow生成的tf.Tensor对象:

  • 你写的transt/transv转换函数最后用tf.convert_to_tensor输出的是TF张量,不是PyTorch要求的torch.Tensor
  • 你开了np_config.enable_numpy_behavior()让TF张量兼容numpy接口,导致TensorDataset初始化做维度校验时,把TF张量的.size属性(这个属性是存张量总元素数的int32整数值,和numpy数组的.size逻辑一致)当成PyTorch张量的.size()方法去调用,才会抛出'numpy.int32' object is not callable的错误。
    你最开始猜维度不匹配是完全找错了方向,代码根本没跑到维度校验的逻辑,在调用.size(0)的时候就已经因为接口不兼容崩了。
代码里的其他隐性问题
  • 验证集图像生成逻辑写串了:你构造vimg的时候堆叠的是训练集的timg4d,不是验证集的vimg4d,后续跑验证相当于直接拿训练集测,结果完全无效。
  • 图像重复堆叠毫无意义:你把同一个单通道图像重复堆5次凑5通道,既不符合医学影像单通道输入的常规逻辑,也和标签5通道(对应5个分割类别)的语义对不上。
  • 用np.resize做3D影像缩放会直接破坏影像结构:这个函数只会粗暴截断/补全数组值,不会做空间插值,resize完的影像已经完全失真,模型根本学不到有效特征。
  • 转换函数的参数名用了Python内置关键字list,会覆盖内置类型,容易触发很难排查的隐性bug。
  • DataLoader的batch_size设为60完全不合理:3D医学影像分割的显存占用极高,24G显存的卡通常batch_size只能开到1~4,设60会直接显存溢出崩溃。
可直接落地的修正步骤
  1. 把所有TensorFlow相关的代码全删掉,包括import tensorflow as tf、np_config相关的导入和配置,做PyTorch训练就不要混着导入TF,避免不必要的接口冲突。
  2. 重写数据转换函数,直接输出PyTorch张量,修正参数命名,不要用内置关键字当参数名:
def transt(data_list):
    array = np.asarray(data_list, dtype=np.float32)
    # 注意:正式训练请把np.resize替换为专业医学影像重采样逻辑,比如MONAI、TorchIO提供的带插值的Resize接口
    resized_array = np.resize(array, [60, 128, 128, 64])
    # 调整维度为PyTorch3D分割要求的 [样本数, 通道数, 深度, 高度, 宽度],单通道输入直接加通道维
    tensor = torch.from_numpy(resized_array).unsqueeze(1)
    return tensor

def transv(data_list):
    array = np.asarray(data_list, dtype=np.float32)
    resized_array = np.resize(array, [7, 128, 128, 64])
    tensor = torch.from_numpy(resized_array).unsqueeze(1)
    return tensor
  1. 修正张量拼接逻辑,不要重复堆叠图像,修正验证集的引用错误:
# 图像不需要重复堆5次,单通道输入直接用转换后的4D张量升维后的结果即可
timg = timg4d
vimg = vimg4d # 这里之前错误引用了timg4d,必须改
# 掩码沿通道维拼接,调整维度顺序匹配输入
tmask = torch.stack([tgall, tIVC, tkidney, tliver, trib], dim=1)
vmask = torch.stack([vgall, vIVC, vkidney, vliver, vrib], dim=1)
  1. 初始化数据集前先打印张量形状校验,确认第0维(样本数)一致即可正常运行:
print(f"训练图像形状:{timg.shape},训练掩码形状:{tmask.shape}")
# 正常输出应为 训练图像形状:torch.Size([60, 1, 128, 128, 64]),训练掩码形状:torch.Size([60, 5, 128, 128, 64])
train_dataset = TensorDataset(timg, tmask)
# batch_size调小,建议设为1~2,开启shuffle
train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)
训练前的额外建议
  • 不要用np.resize处理医学影像,建议用MONAI或者TorchIO的Resize变换,选择三线性插值处理影像、最近邻插值处理掩码,保证重采样后空间结构不被破坏。
  • 加载完影像后记得做灰度归一化,比如根据模态做窗宽窗位截断、Z-score归一化,直接用原始像素值训练会很难收敛。
  • 3D VNet训练建议加入梯度检查点、混合精度训练,降低显存占用。

内容的提问来源于stack exchange,提问作者Christian Thorson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:18:06