首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】7.Tensor与Numpy


本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





TensorNumpy数组之间的互操作性主要得益于它们之间的数据结构相似性。Tensor在很大程度上受到Numpy的启发,因此两者之间的数据转换相对直接。
torch.from_numpy()torch.Tensor.numpy()PyTorch 中用于与 Numpy 数组进行互操作的两个重要函数。了解它们的区别和用法对于在 PyTorchNumpy 之间高效传输数据至关重要。
01

torch.from_numpy():


在创建张量中介绍过torch.from_numpy() 函数,该函数用于将 Numpy 数组(ndarray)转换为 PyTorch 张量(Tensor)。
该函数创建了一个新的张量,该张量与传入的 Numpy 数组共享相同的数据内存。这意味着,如果你更改了张量的数据,原始的 Numpy 数组也会相应地更改,反之亦然。
# 创建一个 NumPy 数组
>>> numpy_array = np.array([[123], [456]])

# 将 NumPy 数组转换为 PyTorch 张量
>>> tensor = torch.from_numpy(numpy_array)

# 修改 PyTorch 张量的一个元素
>>> tensor[00] = 100

# NumPy 数组也发生了改变
>>> numpy_array
array([[100,   2,   3],
       [  4,   5,   6]])

# 同样地,如果修改 NumPy 数组,PyTorch 张量也会改变
>>> numpy_array[11] = 200
>>> tensor
tensor([[100,   2,   3],
        [  4200,   6]], dtype=torch.int32)

  • 创建不共享内存的独立张量:
如果需要创建一个不共享内存的独立张量,可以使用torch.tensor(),因为不论输入数据类型是什么,该方法都只会进行数据复制,不会共享内存。
# 创建一个 NumPy 数组
>>> numpy_array = np.array([[1, 2, 3], [4, 5, 6]])
>>> numpy_array
array([[1, 2, 3],
       [4, 5, 6]]
)

# 创建一个与原始 NumPy 数组不共享内存的新张量
>>> tensor_independent = torch.tensor(numpy_array, dtype=torch.float32)  # 可以指定数据类型
>>> tensor_independent
tensor([[1., 2., 3.],
        [4., 5., 6.]]
, dtype=torch.float32)

>>> numpy_array[11] = 200
>>> numpy_array
array([[  1,   2,   3],
       [  4, 200,   6]]
)

>>> tensor_independent
tensor([[1., 2., 3.],
        [4., 5., 6.]]
, dtype=torch.float32)
也可以使用 copy() 方法创建一个数组副本,然后再将此副本转换为张量:
# 创建一个 NumPy 数组
>>> numpy_array = np.array([[1, 2, 3], [4, 5, 6]])
>>> numpy_array
array([[1, 2, 3],
       [4, 5, 6]]
)

# 创建 NumPy 数组副本,然后再转换为张量
>>> numpy_array_copy = numpy_array.copy()
>>> tensor_independent = torch.from_numpy(numpy_array_copy)
>>> tensor_independent
tensor([[1, 2, 3],
        [4, 5, 6]]
, dtype=torch.int32)

>>> numpy_array[11] = 200
>>> numpy_array
array([[  1,   2,   3],
       [  4, 200,   6]]
)
>>> tensor_independent
tensor([[1, 2, 3],
        [4, 5, 6]]
, dtype=torch.int32)
02

torch.numpy():


torch.numpy()用于将PyTorch张量转换为Numpy数组。与 torch.from_numpy() 类似,这个方法返回的张量和原始的 PyTorch 张量共享内存。
# 假设有一个在 CPU 上的 PyTorch 张量
>>> cpu_tensor = torch.tensor([123])

# 使用 .numpy() 将其转换为 Numpy 数组
>>> numpy_array_from_tensor = cpu_tensor.numpy()

# 修改 Numpy 数组
>>> numpy_array_from_tensor[0] = 10

# 原始的 PyTorch 张量也发生了改变
>>> cpu_tensor
tensor([10,  2,  3])
但是,有一个重要的限制:torch.numpy() 方法仅在张量在 CPU 上时才可用。如果张量在 GPU 上,需要先将其移动到 CPU
# 假设有一个在 GPU 上的 PyTorch 张量
>>> gpu_tensor = torch.tensor([123] , device="cuda")

# 这会抛出错误
>>> numpy_array_from_gpu_tensor = gpu_tensor.numpy()
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

# 正确的做法
>>> numpy_array_from_gpu_tensor = gpu_tensor.to(device="cpu").numpy()
>>> numpy_array_from_gpu_tensor
array([123], dtype=int64)

更多内容可以前往官网查看
https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments