【深度学习pytorch-6】张量与numpy相互转换

张量与 Numpy 数组之间的互相转换

在深度学习中,张量(tensor)和 Numpy 数组(numpy array)是两种常见的数据结构。张量通常用于深度学习框架(如 PyTorch、TensorFlow 等),而 Numpy 数组在科学计算中被广泛使用。为了便于数据处理和计算,常常需要在它们之间进行转换。

下面介绍张量和 Numpy 数组之间的互相转换。


1. PyTorch 张量与 Numpy 数组的互相转换

PyTorch 提供了两种方式来进行转换:torch.tensor().numpy() 方法。

(1) PyTorch 张量转 Numpy 数组

PyTorch 张量可以通过 .numpy() 方法转换为 Numpy 数组。

import torch
import numpy as np

# 创建一个 PyTorch 张量
tensor = torch.tensor([1, 2, 3, 4, 5])

# 转换为 Numpy 数组
numpy_array = tensor.numpy()

print(type(numpy_array))  # 
print(numpy_array)        # [1 2 3 4 5]

注意:如果张量在 GPU 上(即张量是 CUDA 张量),首先需要将其转换到 CPU,然后才能转换为 Numpy 数组。

tensor = torch.tensor([1, 2, 3, 4, 5]).cuda()  # 创建一个在 GPU 上的张量
numpy_array = tensor.cpu().numpy()  # 先转到 CPU 再转换为 Numpy 数组
(2) Numpy 数组转 PyTorch 张量

Numpy 数组可以通过 torch.from_numpy() 方法转换为 PyTorch 张量。

import torch
import numpy as np

# 创建一个 Numpy 数组
numpy_array = np.array([1, 2, 3, 4, 5])

# 转换为 PyTorch 张量
tensor = torch.from_numpy(numpy_array)

print(type(tensor))  # 
print(tensor)        # tensor([1, 2, 3, 4, 5])

注意:torch.from_numpy() 会共享 Numpy 数组的内存,因此如果修改 Numpy 数组的值,PyTorch 张量的值也会改变,反之亦然。


2. TensorFlow 张量与 Numpy 数组的互相转换

TensorFlow 也提供了类似的方法来进行张量与 Numpy 数组之间的转换。

(1) TensorFlow 张量转 Numpy 数组

TensorFlow 张量可以通过 .numpy() 方法转换为 Numpy 数组。

import tensorflow as tf
import numpy as np

# 创建一个 TensorFlow 张量
tensor = tf.constant([1, 2, 3, 4, 5])

# 转换为 Numpy 数组
numpy_array = tensor.numpy()

print(type(numpy_array))  # 
print(numpy_array)        # [1 2 3 4 5]

注意:在 TensorFlow 2.x 中,张量可以直接通过 .numpy() 方法转换为 Numpy 数组。而在 TensorFlow 1.x 中,如果在 Session 中执行操作,可以通过 sess.run() 获取 Numpy 数组。

(2) Numpy 数组转 TensorFlow 张量

Numpy 数组可以通过 tf.convert_to_tensor() 方法转换为 TensorFlow 张量。

import tensorflow as tf
import numpy as np

# 创建一个 Numpy 数组
numpy_array = np.array([1, 2, 3, 4, 5])

# 转换为 TensorFlow 张量
tensor = tf.convert_to_tensor(numpy_array)

print(type(tensor))  # 
print(tensor)        # tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int64)

3. 注意事项:

  • 内存共享torch.from_numpy().numpy() 在 PyTorch 中会共享内存,因此修改一个会影响另一个。但 TensorFlow 中的转换并不共享内存,修改 Numpy 数组不会影响 TensorFlow 张量,反之亦然。

  • 数据类型:转换时,确保数据类型的一致性。PyTorch 和 TensorFlow 张量的默认数据类型是 float32,而 Numpy 数组通常是 int64float64。如果数据类型不同,可能需要进行显式的类型转换。

  • 设备问题:PyTorch 张量可能存在于不同的设备(如 CPU 或 GPU)上。进行转换时,必须确保张量所在的设备是兼容的。TensorFlow 张量通常是在 CPU 上,如果需要将其放到 GPU 上,使用 .gpu().to() 方法。


示例代码(PyTorch 和 TensorFlow 张量与 Numpy 数组互相转换):

PyTorch 示例
import torch
import numpy as np

# 创建 PyTorch 张量
tensor = torch.tensor([1.0, 2.0, 3.0])

# 转为 Numpy 数组
numpy_array = tensor.numpy()

# 修改 Numpy 数组并检查 PyTorch 张量是否变化
numpy_array[0] = 100
print("PyTorch Tensor after modifying Numpy Array:", tensor)  # tensor([100.,  2.,  3.])

# 转回 PyTorch 张量
tensor_back = torch.from_numpy(numpy_array)
print("Converted PyTorch Tensor:", tensor_back)  # tensor([100.,  2.,  3.])
TensorFlow 示例
import tensorflow as tf
import numpy as np

# 创建 TensorFlow 张量
tensor = tf.constant([1.0, 2.0, 3.0])

# 转为 Numpy 数组
numpy_array = tensor.numpy()

# 修改 Numpy 数组并检查 TensorFlow 张量是否变化
numpy_array[0] = 100
print("TensorFlow Tensor after modifying Numpy Array:", tensor)  # tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32)

# 转回 TensorFlow 张量
tensor_back = tf.convert_to_tensor(numpy_array)
print("Converted TensorFlow Tensor:", tensor_back)  # tf.Tensor([100.  2.  3.], shape=(3,), dtype=float64)

总结

  • PyTorch 张量和 Numpy 数组之间:可以使用 .numpy()torch.from_numpy() 进行互相转换。PyTorch 张量和 Numpy 数组共享内存,修改一个会影响另一个。
  • TensorFlow 张量和 Numpy 数组之间:可以通过 .numpy()tf.convert_to_tensor() 进行互相转换。TensorFlow 张量和 Numpy 数组不共享内存,修改一个不会影响另一个。

通过这些转换,您可以方便地在不同框架和工具之间传递数据,进行灵活的数据处理和计算。

你可能感兴趣的:(DL-pytorch,深度学习,pytorch,numpy)