RuntimeError: Expected object of type torch.cuda.LongTensor but found type torch.cuda.IntTensor

问题:

anchor_label = np.array(self.id_dict[int(anchor_id)])

identity_loss = criterion_identity(predicted_id_rgb, anchor_label) + criterion_identity(predicted_id_ir, anchor_label)

RuntimeError: Expected object of type torch.cuda.LongTensor but found type torch.cuda.IntTensor for argument #2 'target'

 

释义:

第二个参数 anchor_label 类型为 IntTensor,不符合要求的 LongTensor

 

原因:

python2 中取消了long 型,python3 统一用 int 型代替

python3中int 支持位数等于 python2 中long型位数

 

测试:

import numpy as np

x = np.float32(1.0)
>>> x
1.0

y = np.int_([1,2,4])
>>> y
array([1, 2, 4])


# dtype 属性确定数组元素的类型,dtype参数说明,详见下面链接
# https://www.jianshu.com/p/6ca8729dd102
z1 =np.array(12752649778202, dtype=np.int_)
>>> z1
OverflowError: Python int too large to convert to C long

z2 =np.array(12752649778202, dtype=np.int32)
>>> z2
OverflowError: Python int too large to convert to C long

z3 =np.array(12752649778202, dtype=np.int64)
>>> z3
OverflowError: Python int too large to convert to C long

z4 =np.array(12752649778202, dtype=np.int)
>>> z4
OverflowError: Python int too large to convert to C long



# 成功找到解决办法
z =np.array(12752649778202, dtype=np.intp)
>>> z
12752649778202

 

 

解决办法:

  1. dtype 设为 np.intp,可使 python2中 long 类型 等价到 python3 中使用
  2. 采用C/C++语言的强制转化,int(long型数值), 可能将超过int位数的字符截断,故建议使用dtype 方式
anchor_label = np.array(self.id_dict[int(anchor_id)],dtype=np.intp) # python3

或者

anchor_label = np.array(int(self.id_dict[int(anchor_id)])) # C/C++ 强制转化

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值