pytorch简介(一)

1、Torch张量

所有深度学习都是基于张量的计算,这些张量是可以在超过2个维度上索引的矩阵的概括。

1.1、生成张量

'''随机生成张量'''
#初始化5*3的张量
x=torch.empty(5,3)
print(x)

'''随机生成一个取值在[0,1]之间的张量'''
x=torch.randn(5,3)
#torch.randn()、torch.normal()、torch.linspace(),分别是标准正态分布,离散正态分布,线性间距向量
'''随机5*3的张量'''
x=torch.rand(5,3)
print(x)

'''torch.randn正态分布5*3张量'''
x=torch.randn(5,3)
print(x)

'''离散正态分布torch.normal,随机数来自于不同的正态分布;支持4种格式'''
mean,std=torch.arange(1., 11.),torch.arange(1, 0, -0.1)
mean, std=0.5,torch.arange(1., 6.)
mean, std=torch.arange(1., 6.),1

x=torch.normal(mean,std)
print(x)
mean,std,size=1,1,(2,3)
y=torch.normal(mean,std,size)
print(y)

'''线性向量 torch.linspace;steps指的是向量的长度'''
x=torch.linspace(start=1, end=10, steps=1)
print(x) #输出tensor([1.])
x=torch.linspace(start=1, end=10, steps=10)
print(x) #输出tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

'''生成全0的张量并指定类型;torch.zeros'''
x=torch.zeros(5,3,dtype=torch.long)
print(x)

'''从已有矩阵转化为张量'''
x=torch.tensor([1,2])
print(x)

'''复用x的属性,创建全为1的张量'''
x=x.new_ones(2,3,dtype=torch.double)
print(x)

'''随机生成和x相似的张量'''
x=torch.randn_like(x,dtype=torch.float)
print(x)

'''获取张量的size'''
print(x.size())

1.2、张量的运算

'''张量运算'''
x=torch.randn(2,3)
y=torch.randn(2,3)
print(x)
print(y)
print(x+y)
print(x-y)
print(x*y)
print(x/y)

'''
合并张量torch.cat([x,y],dim=0);[x,y]将合并的张量x,y;合并的维度dim;
'''
torch.cat([x,y],dim=0)

print('cat dim=0')
z=torch.cat([x,y],dim=1)
print(z)

更多的张量操作可https://pytorch.org/docs/stable/torch.html

1.3、重塑张量

使用.view()方法重塑张量。该方法得到了广泛的应用,因为许多神经网络组件希望它们的输入具有一定的形状。通常,您需要在将数据传递到组件之前进行重塑

'''调整张量形状x.view'''
x=torch.randn(4,4)
y=x.view(16)
z=x.view(-1,8) #  -1 表示另一维度从推导得到
#z=x.view(2,-1) #  -1 表示另一维度从推导得到
print(x)
print(y)
print(z)

z=torch.randn(1)
print(z.item()) #只有张量只有一个元素的时候才能调用这个函数

2、计算图和自动微分

计算图的概念对于高效的深度学习编程至关重要,因为它使您不必自己编写反向传播梯度。计算图只是对如何组合数据以提供输出的规范。由于该图完全指定了哪些参数涉及哪些操作,因此它包含足够的信息来计算导数。这听起来可能含糊不清,所以让我们使用基本标志requires_grad看看发生了什么。

首先,从程序员的角度思考。我们在上面创建的torch.Tensor对象中存储了什么?显然是数据和形状,也许还有其他一些东西。但是,当我们将两个张量加在一起时,我们得到了一个输出张量。这些输出张量只知道其数据和形状。不知道这是其他两个张量的总和(它可以从文件中读取,也可以是其他操作的结果,等等)。

2.1、requires_grad

    torch.Tensor是这个包的核心类,如果你设置了它的参数 ‘.requires_grad=true’ 的话,它将会开始去追踪所有的在这个张量上面的运算。当你完成你得计算的时候,你可以调用’backwward()来计算所有的微分。这个向量的梯度将会自动被保存在’grad’这个属性里面。如果为requires_grad=True,则Tensor对象将跟踪其创建方式。

    如果想要阻止张量跟踪历史数据,你可以调用’detach()'来将它从计算历史中分离出来,当然未来所有计算的数据也将不会被保存。或者你可以使用’with torch.no_grad()‘来调用代码块,不光会阻止梯度计算,还会避免使用储存空间,这个在计算模型的时候将会有很大的用处,因为模型梯度计算的这个属性默认是开启的,而我们可能并不需要。
    第二个非常重要的类是Function,Tensor和Function,他们两个是相互联系的并且可以搭建一个非循环的运算图。每一个张量都有一个’grad_fn’的属性,它可以调用Function来创建Tensor,当然,如果用户自己创建了Tensor的话,那这个属性自动设置为None。
    如果你想要计算引出量的话,你可以调用’.backward()'在Tensor上面,如果Tensor是一个纯数的话,那么你将不必要指明任何参数;如果它不是纯数的话,你需要指明一个和张量形状匹配的梯度的参数。下面来看一些例程。

2.2、实例

'''计算图和自微分'''
x = torch.randn(2, 2)
y = torch.randn(2, 2)
#默认requires_grad=False
print(x.requires_grad, y.requires_grad) #输出False,False
z = x + y
#requires_grad=False时不能通过z回溯
print(z.grad_fn) #不能通过z回溯,输出None

# 可通过“.requires_grad_( )” 改变已有变量的requires_grad值
x = x.requires_grad_()
y = y.requires_grad_()
# z包含了x+y的梯度信息
z = x + y
print(z.grad_fn) #输出<AddBackward0 object at 0x7f606bc780b8>

# 输入的requires_grad=True,输出的同样也为True
print(z.requires_grad) #输出True

# z包含了x,y的计算信息,z.detach()回溯历史得到新的new_z不包含z的计算信息

new_z = z.detach()

print(new_z.grad_fn) #new_z仅仅记录了z的历史,不包含任何信息;输出None

 

参考网址:

https://pytorch.org/tutorials/beginner/deep_learning_nlp_tutorial.html(NLP相关的pytorch)

https://blog.csdn.net/weixin_41070748/article/details/89890330 (一小时入门pytorch)

猜你喜欢

转载自blog.csdn.net/u013069552/article/details/111936533