torch.tensor、numpy.array、list三者之间互相转换

torch.tensor、numpy.array、list三者之间互相转换

image

1.1 list 转 numpy

ndarray = np.array(list)

1.2 numpy 转 list

list = ndarray.tolist()

2.1 list 转 torch.Tensor

tensor=torch.Tensor(list)

2.2 torch.Tensor 转 list

先转numpy,后转list

list = tensor.numpy().tolist()

3.1 torch.Tensor 转 numpy

转换后共享内存
注意,转换后的 pytorch tensor 与 numpy array 指向同一地址,所以,对一方的值改变另一方也随之改变

最完全最常用的将 Tensor 转成 numpy array 的方法如下:
x.detach().to('cpu').numpy()

在最简单的情况下,当你在 CPU 上有一个没有梯度的 PyTorch 张量时,你可以简单地调用 .numpy() 方法

ndarray = tensor.numpy()

*gpu上的tensor不能直接转为numpy
如果 Tensor 位于 “cpu” 以外的设备上,则需要先将其带回 CPU,然后才能调用 .numpy() 方法。
ndarray = tensor.cpu().numpy()


如果张量是需要梯度的计算图的一部分(也就是说,如果 x.requires_grad=True),则需要调用 .detach() 方法:
x = torch.eye(3, requires_grad=True)
x.detach().numpy()

3.2 numpy 转 torch.Tensor

tensor = torch.from_numpy(ndarray)
转换时改变数据类型
tensor = torch.from_numpy(x).type(torch.float32)

转换时发送到不同的设备上,如 GPU
if torch.cuda.is_available():
    y = torch.from_numpy(x).to("cuda")
	

注意,当使用锁页内存(pytorch 中数据加载器的锁页内存 pinned memory)的方式加载数据时,数据放入 GPU 的时候,应该把 non_blocking=True,这样能够缩减访问时间,加快训练。
if torch.cuda.is_available():
    y = torch.from_numpy(x).to("cuda", non_blocking=True)
	
	

posted @ 2024-07-04 17:27  michaelchengjl  阅读(319)  评论(0编辑  收藏  举报