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

PyTorch旧版本中torch.int64转torch.LongTensor失败求助

解决旧版PyTorch中torch.int64无法转换为LongTensor的损失计算错误

我碰到过不少旧版PyTorch的这类类型兼容问题,其实核心是老版本对类型标识的检查比新版更严格——虽然torch.int64和torch.long本质是同一数据类型,但有些损失函数(比如分类任务常用的交叉熵损失)会严格要求目标张量的类型标识为Long,而非Int64,这就导致了你遇到的报错。

先看你的核心问题:你尝试用.long()转换但没成功,大概率是因为旧版中这个方法的返回值需要显式重新赋值,或者转换时机不对。给你几个靠谱的解决方案:

方案1:在张量创建时直接指定Long类型

把创建Ytrain_的代码改成这样,从根源上生成正确类型的张量:

Ytrain_ = torch.from_numpy(y_train.values).type(torch.LongTensor).view(1, -1)[0]

或者更简洁地在from_numpy时指定dtype:

Ytrain_ = torch.from_numpy(y_train.values, dtype=torch.long).view(1, -1)[0]

方案2:确保转换操作生效并重新赋值

如果你还是想保留原来的创建逻辑,那要确保.long()的转换结果被正确赋值——旧版PyTorch中.long()返回的是新张量,不是原地修改,所以必须把结果重新赋值给Ytrain_:

Ytrain_ = torch.from_numpy(y_train.values).view(1, -1)[0]
# 显式转换并重新赋值,确保这行代码没有被后续逻辑覆盖
Ytrain_ = Ytrain_.long()
# 或者用type()方法更明确
# Ytrain_ = Ytrain_.type(torch.LongTensor)

loss = loss_fn(Ypred, Ytrain_) # calc loss on the prediction

验证方法

修改后可以用print(Ytrain_.dtype)确认类型,旧版中应该显示torch.int64(这和torch.long是完全等价的),但损失函数会认可这个类型标识。

另外要注意:有些旧版损失函数不仅要求目标是Long类型,还要求目标的形状和预测输出Ypred匹配,你可以顺便检查下两者的形状是否一致(比如Ypred是(batch_size, num_classes),目标应该是(batch_size,)这样的一维张量)。

内容的提问来源于stack exchange,提问作者Nothing here

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:25:46