tensor中数据类型的相互转换
Pytorch中的Tensor常用的类型转换函数
- tensor数据类型转换
在tensor的后面添加: .int()、.float()、.double()等.
同时也可以使用 .to(type) 进行实现。
同时也可以使用 type()函数 ,data为Tensor数据类型,data.type()为给出data的类型,如果使用data.type(torch.FloatTensor)则强制转换为torch.FloatTensor类型张量。当你不知道要转换为什么类型时,但需要求a1,a2两个张量的乘积,可以使用a1.type_as(a2)将a1转换为a2同类型。 - tensor<–>numpy
Tensor---->Numpy 使用 tensor.numpy(),tensor为Tensor变量
Numpy ----> Tensor 使用 torch.from_numpy(data),data为numpy变量 - tensor<–>Python
Tensor ----> 单个Python数据,使用data.item(),data为Tensor变量且只能为包含单个数据
Tensor ----> Python list,使用data.tolist(),data为Tensor变量,返回shape相同的可嵌套的list - 数据存储位置转换
CPU张量 ----> GPU张量,使用data.cuda()
GPU张量 ----> CPU张量,使用data.cpu()
判断某个变量类型可以使用:isinstance(data,type)
例如:判断某个变量是否为张量
if isinstance(rchannel,torch.Tensor):
attens = torch.split(atten, rchannel.item()//self.radix, dim=1)
else:
attens = torch.split(atten, rchannel // self.radix, dim=1)
5)使用.shape以及.size()获得张量的形状时,比较不稳定,有时输出的形状元素是张量,有时是int型:例如:
#第一种获得张量的形状,结果常为tensor,但是有时会转为int型的方法
x_shape = list(x.size())
batch, rchannel=x_shape[0],x_shape[1]
#第二种获得张量的形状,结果常为tensor,但是有时会转为int型的方法
batch, rchannel = x.shape[:2] #获得的值有时是张量有时是int,不稳定
#解决方法
if isinstance(rchannel,torch.Tensor):
attens = torch.split(atten, rchannel.item()//self.radix, dim=1)
else:
attens = torch.split(atten, rchannel // self.radix, dim=1)