飞燕提醒:Tensor类型转为Numpy类型,要注意使用detach()函数,将张量从GPU设备迁移到CPU设备上。此处照应了本教程中《detach原理》相关小节的内容。
在做AI业务开发时候,常常需要PyTorch的Tensor类型和Numpy类型进行转换,下面给大家介绍一下两者的转换过程。
首先,导入需要使用的包:
import numpy as np
import torch
然后,创建一个Numpy类型的数组:
x = np.ones(3)
print(type(x))
这里创建了一个一维的数组,3个都为1,我们打印一下这个x的类型显示如下:
<class "numpy.ndarray">
用下面的代码将上述的x转换成Tensor类型:
y = torch.tensor(x)
print(type(x))
这个代码打印的结果是:
<class "torch.Tensor">
当然,也可以使用:
y = torch.from_numpy(x)
import torch
x = torch.ones(3)
y = x.detach().numpy()
也可以使用:
y = x.numpy()
从Numpy类型转为Tensor类型的时候,经常需要用到[None]操作。如下代码所示:
torch.as_tensor(observation_space.sample()[None])
这是强化学习中常用的代码,大意是:
从某个仿真环境中得到状态空间的某个抽样数据,因为抽样数据是Numpy类型的,所以需要转换为Tensor类型。并且,在转换之前需要进行[None]操作。
[None]是 NumPy 的一种索引操作,等价于 np.newaxis。它的作用是在数组的指定位置插入一个新的维度。如下所示:
import numpy as np
# 假设采样结果是一个形状为 (3,) 的数组
sample = np.array([1, 2, 3])
print(sample.shape) # 输出: (3,)
# 使用 [None] 增加一个维度
sample_with_new_dim = sample[None]
print(sample_with_new_dim.shape) # 输出: (1, 3)
在深度学习中,输入数据通常需要是批量的形式(即多组数据)。例如:
原始观测数据的形状可能是 (height, width, channels) 或 (feature_dim,),但模型通常期望输入的形状是 (batch_size, height, width, channels) 或 (batch_size, feature_dim)。
通过 [None] 增加一个维度,可以将单个观测值转换为批量形式,即使批量大小为 1。这在后续的神经网络计算中是必要的。