Pytorch深度学习基础之Tensor

Posted AI量化实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pytorch深度学习基础之Tensor相关的知识,希望对你有一定的参考价值。

当下流行的深度学习框架,都会涉及一个基本的概念,就是张量(Tensor)。张量是什么?简单的理解,就是数据的容器。零维张量就是数字或者标量,一维张量就是向量,二维或者更高维就是矩阵。因为机器只能处理数字相关的信息,所以无论是图片还是自然语言的处理,都需要把输入信息转化为高维数字矩阵的形式。

 

那为何需要新引入张量,而不直接使用numpyndarray呢?Tensor提供了一些辅助神经网络训练的功能,比ndarray更适合深度学习。

 

简而言之一句话,就像python里的int,float,string等数据类型一样,tensor就是深度学习框架的基本数据类型,以至于Google的深度学习框架名字就叫TensorFlow,就是“张量的流”的意思。

1.1.1.1.1      Tensor(张量)

我们初始化一个32列的矩阵,直接把数组直接赋值给torch.Tensor,可以通过Tensorsize函数查看张量的维度。

>>>import torch

>>> a = torch.Tensor([[1,1],[2,2],[3,3]])

>>> a

tensor([[ 1.,  1.],

        [ 2.,  2.],

        [ 3.,  3.]])

>>> a.size()

torch.Size([3, 2])

 

在实际的应用场景中,我们难得会直接从数组中初始化Tensor,更多情况下,会初始化一个全0或全1亦或是随机初始值的特定维度的张量。

 

有几种常用的方法,比如得到32列值全为0的张量:

>>> a = torch.zeros((3,2))

>>> a

tensor([[ 0.,  0.],

       [ 0.,  0.],

       [ 0.,  0.]])

比如得到32列的随机值的张量:

>>> 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]])

 

关于PytorchTensor,还有重要一点,就是可以和numpyndarray互转。

>>>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)

 

numpyndarray转为torchtensor同样简单,代码如下:

>>> 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]])     #c21列的张量

>>> a*c

tensor([[ 0.5000,  0.5000],

       [ 3.0000,  3.0000]])#列向量,元素操作在各行上

 

view方法,就是对矩阵进行reshape,这个方法很重要,因为多层神经网络在相互连接的时候,前后两个层的维度是需要对齐的,这时需要对tensorsize进行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]))

扫描下方二维码,关注:AI量化实验室(ailabx),了解AI量化最前沿技术、资讯。

以上是关于Pytorch深度学习基础之Tensor的主要内容,如果未能解决你的问题,请参考以下文章

「深度学习一遍过」必修10:pytorch 框架的使用

狂肝两万字带你用pytorch搞深度学习!!!

深度学习——基础(基于Pytorch代码)

深度学习--PyTorch定义Tensor以及索引和切片

深度学习计算模型/Tensor的读取和存储(PyTorch)

《动手学深度学习》PyTorch: 数据操作