PyTorch张量是在PyTorch中对神经网络进行编程时将使用的数据结构。
在对神经网络进行编程时,数据预处理通常是整个过程的第一步之一,数据预处理的一个目标是将原始输入数据转换为张量形式。
PyTorch张量是torch.Tensor Python类的实例。 我们可以使用类构造函数创建torch.Tensor对象,如下所示:
> t = torch.Tensor()
> type(t)
torch.Tensor
这将创建一个空的张量(没有数据的张量),但是我们将在片刻内添加数据。
首先,让我们看一些张量属性。 每个手电筒都具有以下属性:
torch.dtype
torch.device
torch.layout
查看Tensor t,我们可以看到以下默认属性值:
> print(t.dtype)
> print(t.device)
> print(t.layout)
torch.float32
cpu
torch.strided
dtype
在本例中为torch.float32
,它指定张量中包含的数据类型。 张量包含具有以下类型之一的统一(相同类型)数值数据:
Data type | dtype | CPU tensor | GPU tensor |
---|---|---|---|
32-bit floating point | torch.float32 | torch.FloatTensor | torch.cuda.FloatTensor |
64-bit floating point | torch.float64 | torch.DoubleTensor | torch.cuda.DoubleTensor |
16-bit floating point | torch.float16 | torch.HalfTensor | torch.cuda.HalfTensor |
8-bit integer (unsigned) | torch.uint8 | torch.ByteTensor | torch.cuda.ByteTensor |
8-bit integer (signed) | torch.int8 | torch.CharTensor | torch.cuda.CharTensor |
16-bit integer (signed) | torch.int16 | torch.ShortTensor | torch.cuda.ShortTensor |
32-bit integer (signed) | torch.int32 | torch.IntTensor | torch.cuda.IntTensor |
64-bit integer (signed) | torch.int64 | torch.LongTensor | torch.cuda.LongTensor |
注意每种类型如何具有CPU和GPU版本。 关于张量数据类型要记住的一件事是,张量之间的张量操作必须在具有相同数据类型的张量之间发生。 但是,此声明仅适用于低于1.3
的PyTorch版本。 有关详细信息,请参见下面的PyTorch Tensor Type Promotion部分。
从PyTorch 1.3版开始,算术和比较运算可以执行提升为通用dtype的混合类型运算。
以下示例在1.2版中是不允许的。 但是,在1.3版及更高版本中,相同的代码将返回带有dtype = torch.float32的张量。
torch.tensor([1], dtype=torch.int) +
torch.tensor([1], dtype=torch.float32)
有关更多详细信息,请参见完整文档。
torch.result_type
提供确定混合型操作26012结果的函数。torch.can_cast
公开类型提升26805的转换规则。torch.promote_types
公开升级逻辑26655。设备(在我们的情况下为cpu)指定分配张量数据的设备(CPU或GPU)。 这确定了将在何处执行给定张量的张量计算。
PyTorch支持使用多个设备,并且使用如下索引来指定它们:
> device = torch.device('cuda:0')
> device
device(type='cuda', index=0)
如果我们具有上述设备,则可以通过将设备传递给张量的构造函数来在该设备上创建张量。 使用多个设备时要记住的一件事是,张量之间的张量操作必须在同一设备上存在的张量之间进行。
随着我们成为高级用户,通常会使用多种设备,因此现在无需担心。
在我们的例子中,大步布局指定了张量如何存储在内存中。 要在此处了解有关步幅检查的更多信息。
目前,这就是我们需要知道的。
作为神经网络程序员,我们需要注意以下几点:
dtype
)的数据。dtype
和设备
。现在让我们看一下使用PyTorch中的数据创建张量的常用方法。
这些是在PyTorch中使用数据(类似数组)创建张量对象(torch.Tensor类的实例)的主要方法:
torch.Tensor(data)
torch.tensor(data)
torch.as_tensor(data)
torch.from_numpy(data)
让我们看看其中的每一个。 它们都接受某种形式的数据,并为我们提供了torch.Tensor
类的实例。 有时候,当有多种方法可以达到相同的结果时,事情可能会变得令人困惑,所以让我们来分解一下。
我们首先使用每个选项创建一个张量,然后看看我们得到了什么。 我们将从创建一些数据开始。
我们可以使用Python列表或序列,但是numpy.ndarrays
将是更常见的选择,因此我们将使用numpy.ndarray,如下所示:
> data = np.array([1,2,3])
> type(data)
numpy.ndarray
这为我们提供了一个简单的数据类型为numpy.ndarray的数据。
现在,让我们使用这些选项1-4中的每一个来创建张量,然后看看我们得到了什么:
> o1 = torch.Tensor(data)
> o2 = torch.tensor(data)
> o3 = torch.as_tensor(data)
> o4 = torch.from_numpy(data)
> print(o1)
> print(o2)
> print(o3)
> print(o4)
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
除第一个选项外,所有选项(o1,o2,o3,o4)似乎都产生了相同的张量。 第一个选项(o1)在数字后面有点,表示数字为浮点数,而后三个选项的类型为int32。
// Python code example of what we mean
> type(2.)
float
> type(2)
int
在下一篇文章中,我们将更深入地研究这种差异以及隐藏在幕后的其他一些重要差异。
下一篇文章中的讨论将使我们看到这些选项中哪一个最适合创建张量。 现在,让我们看一些可用的创建选项,这些选项可以在没有任何数据的情况下从头开始创建张量。
这是一些其他可用的创建选项。
我们有 torch.eye()
函数,该函数返回一个2D张量,对角线为1,其他位置为零。 名称 eye()
与单位矩阵的概念有关, 单位矩阵
是一个在主对角线上带有1且在其他位置均为0的方阵。
> print(torch.eye(2))
tensor([
[1., 0.],
[0., 1.]
])
我们有torch.zeros()
函数,该函数创建具有指定shape
参数形状的零张量。
> print(torch.zeros([2,2]))
tensor([
[0., 0.],
[0., 0.]
])
同样,我们有torch.ones()
函数来创建张量。
> print(torch.ones([2,2]))
tensor([
[1., 1.],
[1., 1.]
])
我们还有torch.rand()
函数,该函数创建一个具有指定参数形状的张量,该参数的值是随机的。
> print(torch.rand([2,2]))
tensor([
[0.0465, 0.4557],
[0.6596, 0.0941]
])
这是不需要数据的可用创建功能的一小部分。 请查阅PyTorch文档以获取完整列表。
希望您现在对我们如何使用PyTorch通过使用数据以及不需要数据的内置函数创建张量有一个很好的了解。 如果我们正在使用numpy.ndarrays
,那么此任务将很容易,如果您已经熟悉NumPy,那么恭喜您。
在下一篇文章中,我们将对需要数据的创建选项进行更深入的研究,我们将发现这些选项之间的差异以及最有效的选项。 下一个见!