当下流行的深度学习框架,都会涉及一个基本的概念,就是张量(Tensor)。张量是什么?简单的理解,就是数据的容器。零维张量就是数字或者标量,一维张量就是向量,二维或者更高维就是矩阵。由于机器只能处理数字相关的信息,因此不管是图片仍是天然语言的处理,都须要把输入信息转化为高维数字矩阵的形式。python
那为什么须要新引入张量,而不直接使用numpy的ndarray呢?Tensor提供了一些辅助神经网络训练的功能,比ndarray更适合深度学习。git
简而言之一句话,就像python里的int,float,string等数据类型同样,tensor就是深度学习框架的基本数据类型,以致于Google的深度学习框架名字就叫TensorFlow,就是“张量的流”的意思。github
1.1.1.1.1 Tensor(张量)数组
咱们初始化一个3行2列的矩阵,直接把数组直接赋值给torch.Tensor,能够经过Tensor的size函数查看张量的维度。网络
>>>import torch框架
>>> a = torch.Tensor([[1,1],[2,2],[3,3]])函数
>>> a学习
tensor([[ 1., 1.],人工智能
[ 2., 2.],blog
[ 3., 3.]])
>>> a.size()
torch.Size([3, 2])
在实际的应用场景中,咱们可贵会直接从数组中初始化Tensor,更多状况下,会初始化一个全0或全1亦或是随机初始值的特定维度的张量。
有几种经常使用的方法,好比获得3行2列值全为0的张量:
>>> a = torch.zeros((3,2))
>>> a
tensor([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
好比获得3行2列的随机值的张量:
>>> b = torch.randn((3,2))
>>> b
tensor([[-0.0648, -1.2692],
[ 0.9562, 0.0018],
[-1.3293, 0.0097]])
对于张量内的数据访问,与numpy是同样的,直接经过索引访问和修改。
>>> b
tensor([[-0.0648, -1.2692],
[ 0.9562, 0.0018],
[-1.3293, 0.0097]])
>>>b[0,0]
tensor(1.00000e-02 *
-6.4819)
>>>b[0,1]
tensor(-1.2692)
>>>b[0,1]=888
>>> b
tensor([[-6.4819e-02, 8.8800e+02],
[ 9.5625e-01, 1.8241e-03],
[-1.3293e+00, 9.7056e-03]])
关于Pytorch的Tensor,还有重要一点,就是能够和numpy的ndarray互转。
>>>np_b = b.numpy()
>>> np_b
array([[-6.4819142e-02, 8.8800000e+02],
[ 9.5624775e-01, 1.8241187e-03],
[-1.3292531e+00, 9.7055538e-03]],dtype=float32)
从numpy的ndarray转为torch的tensor一样简单,代码以下:
>>> a = np.array([[1,1],[2,2]])
>>> a
array([[1, 1],
[2, 2]])
>>>tensor_a = torch.from_numpy(a)
>>> tensor_a
tensor([[ 1, 1],
[ 2, 2]], dtype=torch.int32)
张量加法有两种形式,一种是直接使用加号,另外一种使用torch.add方法:
>>> a = torch.Tensor([1,1])
>>> b = torch.Tensor([2,2])
>>>a+b
tensor([ 3., 3.])
>>>torch.add(a,b)
tensor([ 3., 3.])
这里须要特别说明,深度学习里的张量计算,不是线性代数里的矩阵运算,并且元素直接计算,两个参与计算的张量顺序无关,好比a*b=b*a(线性代数里的矩阵是不能够的),另外是张量的元素直接加减或乘除,各张量之间行数与列数必须相同,有几个例外:
1, 标量,直接把标题做用于张量的每一个元素。
>>> a
tensor([[ 1., 1.],
[ 2., 2.]])
>>> a+1
tensor([[ 2., 2.],
[ 3., 3.]])
2, 一维向量,向量长度需等于张量列数,各元素做用于列元素
>>> a =torch.Tensor([[1,1],[2,2]])
>>> a
tensor([[ 1., 1.],
[ 2., 2.]])
>>>b = torch.Tensor([0.5,1.5]) #b是行向量
>>> a*b
tensor([[ 0.5000, 1.5000],
[ 1.0000, 3.0000]]) #行向量,元素操做在列上
3, 行数相同,列数为1,元素使用于各行
>>>c = torch.Tensor([[0.5],[1.5]]) #c是2行1列的张量
>>> a*c
tensor([[ 0.5000, 0.5000],
[ 3.0000, 3.0000]])#列向量,元素操做在各行上
view方法,就是对矩阵进行reshape,这个方法很重要,由于多层神经网络在相互链接的时候,先后两个层的维度是须要对齐的,这时须要对tensor的size进行view:
>>> x = torch.randn(4, 4)
>>> y = x.view(-1,8) #负1表示这一个维度经过推断获得。
>>> z = x.view(16)
(torch.Size([4, 4]), torch.Size([2, 8]),torch.Size([16]))
关于做者:魏佳斌,互联网产品/技术总监,北京大学光华管理学院(MBA),特许金融分析师(CFA),资深产品经理/码农。偏心python,深度关注互联网趋势,人工智能,AI金融量化。致力于使用最前沿的认知技术去理解这个复杂的世界。AI量化开源项目:https://github.com/ailabx/ailabx
扫描下方二维码,关注:AI量化实验室(ailabx),了解AI量化最前沿技术、资讯。