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
相关产品推荐
相关产品推荐

