携手创作,共同成长!这是我参与「掘金日新计划 · 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, 10, 1)
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的用法来理解