张量(Tensor)是神经网络中使用的主要数据结构,在网络的输入、转换和输出都涉及到张量。张量的概念是对其他更具体概念的数学概括,张量在计算机科学方面和数学方面本质上相同,但术语不同,对比图如下,其中Indexes required表示需要的索引数。
换言之,在深度学习和神经网络中,张量是n维数组,我们用张量这个词来表示所有的n值,比如标量是零维张量、矢量是一维张量、矩阵是二维张量、n维数组是n维张量。
张量的基本属性主要有三个:
(1)张量的秩是指张量中存在的维数
(2)张量的轴是指一个张量的一个特定的维数
(3)张量的形状是由每个轴的长度决定
三者的联系为一个张量的秩告诉我们一个张量有多少个轴,每个张量的形状告诉我们每个轴的长度,而轴的长度告诉我们沿轴有多少个索引!
举一个3乘以3的矩阵进行说明:
import torch
array = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
t = torch.tensor(array)
len(t.shape)
t.shape
结果显示:
结果分析:
1. 一个张量的大小(Size)和一个张量的形状(Shape)是一样的。
2. 这个张量的形状揭示了一个张量的秩,该秩等于它的形状的长度。
3. 这个秩为2的张量的每一个轴的长度是3
补充说明:
一个张量的形状很重要,主要有以下几个原因:
Pytorch张量除了拥有基本的三种属性外,还具备以下三种属性:
import torch
t = torch.Tensor()
print(t.dtype)
print(t.device)
print(t.layout)
结果如下:
torch.float32
cpu
torch.strided
(1)数据类型
(2)设备
我们可以为张量指定一个设备,这个设备可以是CPU,也可以是GPU,这决定张量计算的位置。
device = torch.device('cuda:0')
device
在jupyter notebook上运行上面的代码,其输出结果如下:
device(type='cuda', index=0)
这意味着这个设备是一个GPU,index=0表示第一个GPU。
注意事项:
(1)Pytorch中提供了四种不同的方法来创建有初始值的张量,具体如下:
import torch
import numpy as np
data = np.array([1, 2, 3])
# 四种不同方法
torch.Tensor(data)
torch.tensor(data)
torch.as_tensor(data)
torch.from_numpy(data)
四种方法各自返回的结果如下:
四种方法的区别:
对于第4点的区别可通过如下代码进行说明:
import torch
import numpy as np
data = np.array([1, 2 , 3])
t1 = torch.Tensor(data)
t2 = torch.tensor(data)
t3 = torch.as_tensor(data)
t4 = torch.from_numpy(data)
# 改变元素的值
data[0] = 0
data[1] = 0
data[2] = 0
print(t1)
print(t2)
print(t3)
print(t4)
结果如下:
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
在选择方法时,建议优先考虑torch.tensor()和torch.as_tensor().
(torch.from_numpy调用时只接受numpy数组)
(2)Pytorch中有几种没有提供任何数据的情况下使用的创建选项,具体如下: