前言
最近在做深度学习作业时,经常将数据转来转去,数据格式不正确就不能被放入模型中训练,所以做一个数据转换的总结。
一、numpy转tensor
直接torch.tensor() 注意:不共享内存,转换较慢
a = np.zeros((2,10))
b = torch.tensor(a,dtype= torch.int)
c = torch.tensor(a,dtype= torch.float)
d = torch.tensor(a,dtype= torch.long)
print(type(a))
print(type(b))
print(type(c))
print(type(d))
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
<class 'torch.Tensor'>
<class 'torch.Tensor'>
因为在训练时模型对数据有不同的要求,所以看要求转成不同的tensor格式。
torch.from_numpy(c)
共享内存,就是一个改变另一个也会改变。比较快。
a = np.zeros(3)
b= torch.from_numpy(a)
print(a,b)
b[0] = 1
print(a,b)
[0. 0. 0.] tensor([0., 0., 0.], dtype=torch.float64)
[1. 0. 0.] tensor([1., 0., 0.], dtype=torch.float64)
二、tensor转numpy
x_ = x.detach().numpy()
detach()是将requires_grad为false,得到的这个tensor永远不需要计算其梯度不具有grad
如果x在Gpu上
x_ = x。cpu().detach().numpy()
三、numpy,tensor转数字
.item()
print(type(a[1]))
print(type(b[1]))
print(type(a[1].item()))
print(type(b[1].item()))
<class ‘torch.Tensor’>
<class ‘numpy.float32’>
<class ‘float’>
<class ‘float’>
注意·:该函数只能用在对象引用一个数组,不能用在包含一个数组的对象,如a.item()或b.item()