zeros什么意思_什么是张量?

学过线性代数的童鞋都知道,矩阵可以进行各种运算,比如:

矩阵的加法:

+

矩阵的转置:

矩阵的点乘:

.

矩阵的对应元素相乘(这个线性代数里面好像没有?不过很明显,对于相同形状的矩阵我们可以定义这样的运算,在机器学习中这样的运算运用的比较多):

*

(上面既然提到了形状,我们就说说形状这个概念的含义,它是指在每个方向上有多少个数,比如上面这几个矩阵的形状都是(3,3))

为了方便存储矩阵及进行矩阵之间的运算,大神们抽象出了PyTorch库,PyTorch库中有一个类叫torch.Tensor,这个类存储了一个矩阵变量,并且有一系列方法用于对这个矩阵进行各种运算。上面的这些矩阵运算都可以通过torch.Tensor类的相应方法实现。

比如上面的矩阵加法:

import torch  # 引入torch类
x = torch.rand(5, 3)  # 生成一个5*3的矩阵x,矩阵的每个元素都是0到1之间的随机数,x的类型就是torch.Tensor,x里面存了一个5*3的矩阵
y = torch.zeros(5, 3, dtype=torch.long)  # 生成一个5*3的矩阵y,矩阵的每个元素都是0,每个元素的类型是long型,y的类型就是torch.Tensor,y里面存了一个5*3的矩阵
y.add_(x)  # 使用y的add_方法对y和x进行运算,运算结果保存到y

上面的x、y的类型都是torch.Tensor,Tensor这个单词一般可译作“张量”。但是上面我们进行的都是矩阵运算,为什么要给这个类型起名字叫张量呢,直接叫矩阵不就行了吗?张量又是什么意思呢?

这是因为:通常我们不但要对矩阵进行运算,我们还会对数组进行运算(当然数组也是特殊的矩阵),比如两个数组的加法:

在机器学习中,我们更多的会对下面形状这样的数进行运算:

9f81f9678ec9ac2072e2850461952293.png

大家可以把这种数看作几个矩阵叠在一起,这种我们暂且给它取一个名字叫“空间矩阵”或者“三维矩阵”。

因此用“矩阵”不能表达所有我们想要进行运算的变量,所以,我们使用张量把矩阵的概念进行扩展。这样普通的矩阵就是二维张量,数组就是一维张量,上面这种空间矩阵就是三维张量,类似的,还有四维、五维、六维张量

那么上面这种三维张量怎么表达呢?

比如对于一维张量[1,2,3],

在PyTorch中可以表达为torch.tensor([1,2,3])

对于二维张量

在PyTorch中可以表达为torch.tensor([[1,2,3],[4,5,6]])

聪明的读者可能发现了,多一个维度,我们就多加一个[]

所以对于上图中的“空间矩阵”,我们可以这样表达:

torch.tensor([[[9,1,8],[6,7,5],[3,4,2]],[[2,9,1],[8,6,7],[5,3,4]],[[1,5,9],[7,2,6],[4,8,3]]])

上面可能不容易看清楚,我们把它写的再好看一些:

torch.tensor([
[[9,1,8],[6,7,5],[3,4,2]],
[[2,9,1],[8,6,7],[5,3,4]],
[[1,5,9],[7,2,6],[4,8,3]]
])

可以看到上面中间三行的每一行都是一个矩阵,所以我们就知道了,每多一个方向的数据,我们就多加一个[]

再重复一下形状的概念,这个概念也很重要,

对于矩阵

,它有两行三列,我们说它的形状是(2,3)

对于上面的那个空间矩阵,在x轴、y轴、z轴上它都是三个数,所以我们说它的形状是(3,3,3)

同理我们可以生成任意形状的张量:

x = torch.rand(2,3,4,5)  #生成一个(2,3,4,5)形状的张量,注意与torch.rand([2,3,4,5])的区别

所以为什么叫张量而不是矩阵呢?就是因为我们通常需要处理的数据有零维的(单纯的一个数字)、一维的(数组)、二维的(矩阵)、三维的(空间矩阵)、还有很多维的。Pytorch为了把这些各种维统一起来,所以起名叫张量。

即:

张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量。如果你之前用过NumPy,你会发现 Tensor和NumPy的多维数组非常类似。

也就是说,tensor和NumPy都是为了表达张量(多维数组),在这些张量(多维数组)上可以进行各种各样的运算,因此把张量及其运算封装成了类,张量的运算就是类里面的方法。

创建tensor:

x = torch.empty(5, 3)
x = torch.rand(5, 3)
x = torch.zeros(5, 3, dtype=torch.long)
x = torch.tensor([5.5, 3])
x = x.new_ones(5, 3, dtype=torch.float64)
y = torch.randn_like(x, dtype=torch.float)

获取Tensor的形状:

print(x.size())
print(x.shape)

Tensor的各种操作:

  y = torch.rand(5, 3)
  print(x + y)  # 加法形式一
  print(torch.add(x, y))  # 加法形式二
  # adds x to y
  y.add_(x)  # 加法形式三
  print(y)

PyTorch中的Tensor支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等,总之,凡是你能想到的操作,在pytorch里都有对应的方法去完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值