PyTorch——Tensor的介绍(一)Tensor创建

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情


上一篇文章中,我们介绍了机器学习问题的构成元素,pytorch中的基本概念:张量,变量,nn.Module,Tensor与机器学习的关系

今天我们来进行Tensor的创建编程实例。


首先导入torch的包

  • 1.1 创建张量

  • 1.1.1 在定义的时候,直接初始化

创建一个2x2的矩阵,并打印结果和类型

a = torch.Tensor([[1, 2], [3, 4]])
print(a)
print(a.type())
复制代码

运行结果:

tensor([[1., 2.],
        [3., 4.]])
torch.FloatTensor
复制代码

可以看到,直接定义一个Tensor,它的类型是float的

  • 1.1.2 在定义的时候,规定它的类型

直接定义它的shape,是一个2x3的Tensor,并没有指定具体的值,那么这些值就是初始化的值,也就是随机的值,或者也可以认为是当前内存的值

a = torch.Tensor(2, 3)
print(a)
print(a.type())
复制代码

运行结果:

tensor([[7.0976e+22, 1.8515e+28, 7.3867e+20],
        [2.0027e-19, 1.9300e+28, 2.2855e+20]])
torch.FloatTensor
复制代码
  • 1.1.3 定义一个特殊的Tensor

定义一个全是一的Tensor;

定义一个对角线全是1的Tensor;

定义一个全是0的Tensor:

a = torch.ones(2, 2)
print(a)
print(a.type())

b = torch.eye(2, 2)
print(b)
print(b.type())

c = torch.zeros(2, 2)
print(c)
print(c.type())
复制代码

运行结果:

tensor([[1., 1.],
        [1., 1.]])
torch.FloatTensor
tensor([[1., 0.],
        [0., 1.]])
torch.FloatTensor
tensor([[0., 0.],
        [0., 0.]])
torch.FloatTensor
复制代码

还可以使用zeros_like来定义一个和其他Tensor的shape一样的,但是全是0的Tensor

当然,除了zeros_like,还有ones_like

b = torch.Tensor(2, 3)
b = torch.zeros_like(b)
print(b)
print(b.type())
复制代码

运行结果:

tensor([[0., 0., 0.],
        [0., 0., 0.]])
torch.FloatTensor
复制代码
  • 1.1.4 随机
  • 这种方式主要用于参数的初始化和随机生成值

a = torch.rand(2, 2)
print(a)
print(a.type())
复制代码

运行结果:

tensor([[0.1502, 0.1188],
        [0.4389, 0.8965]])
torch.FloatTensor
复制代码

可以看到,随机值是在0-1之间的

还可以定义满足分布的Tensor,std=torch.rand(5)是可以随机生成5个值,这5个值对应5个标准差,这5个标准差和mean就构成了5组标准差

a = torch.normal(mean=0.0, std=torch.rand(5))
print(a)
print(a.type())
复制代码

运行结果:

tensor([0.0376, 0.6736, 0.3055, 0.0603, 0.8457])
torch.FloatTensor
复制代码

输出的a包含了1x5大小的Tensor,那么Tensor是怎么计算出来的呢?

  • torch.rand(5)是可以随机生成5个值,这5个值就对应5个标准差,这5个标准差和mean=0.0就构成了5组均值和标准差,分别是0,标准差1;0,标准差2;0,标准差3;0,标准差4;0,标准差5;对于这样的5组的均值和标准差,我们就能构造出5组不同的正态分布的函数,然后从这5组正态分布的函数中随机生成满足正态分布的数值,这里呢,就包含这样的5组数值,每一组标准差对应一个值。

还可以对mean也就行随机

a = torch.normal(mean=torch.rand(5), std=torch.rand(5))
print(a)
print(a.type())
复制代码

运行结果:

tensor([ 1.3228, -0.1540,  1.7740,  0.3753, -0.6841])
torch.FloatTensor
复制代码

这样的话就对应到了5个随机的mean和5个随机的标准差,然后生成5组不同的正态分布的函数,然后从这5组正态分布的函数中随机生成满足正态分布的数值,每一个值对应一组均值和标准差生成的正态分布的函数。

  • 1.1.5 定义均匀分布

先定义大小,在定义范围,例子是-1到1之间的均匀分布,在这之间进行sample

d = torch.Tensor(2, 2).uniform_(-1, 1)
print(d)
print(d.type())
复制代码

运行结果:

tensor([[ 0.7100, -0.1249],
        [ 0.8495, -0.0388]])
torch.FloatTensor
复制代码
  • 1.1.6 定义序列
  • 定义一个0-9的序列

d = torch.arange(0, 101)
print(d)
print(d.type())
复制代码

运行结果:

tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
torch.LongTensor
复制代码

最后的值是不包含在其中的,要想定义到10的,需要是11

最后的1是步长

  • 使用linspace拿到等间隔的n个数字
a = torch.linspace(2, 10, 4)
print(a)
print(a.type())
复制代码

运行结果:

tensor([ 2.0000,  4.6667,  7.3333, 10.0000])
torch.FloatTensor
复制代码
  • 将序列进行打乱

打乱索引

d = torch.randperm(10)
print(d)
print(d.type())
复制代码

运行结果:

tensor([3, 7, 0, 1, 8, 4, 9, 6, 5, 2])
torch.LongTensor
复制代码

可以看到,使用arange来定义的序列以及通过randperm来定义的序列的数据类型都是LongTensor,而其他的类型是FloatTensor,我们在采用Tensor来编程的时候,一定要注意它的类型;而且我们的张量,都是所见即所得的,就是我们可以打印出它的具体的值

  • 1.1.7 和numpy的比较
import numpy as np

a = np.array([[1, 2], [3, 4]])
print(a)
复制代码

运行结果:

[[1 2]
 [3 4]]
复制代码

numpy的使用和Tensor有非常大的相似性,甚至可以看成Tensor是numpy打印的数字中套了一层Tensor,在理解的时候可以这么理解。如果不了解numpy,可以结合我之前的文章,numpy的基础知识numpy.arg的用法来理解

9JQ4ZCQY3M({Q$KEN%9BFQX.png

猜你喜欢

转载自juejin.im/post/7130835879786414094