语法与入门-pytorch与自然语言处理

语法与入门-pytorch与自然语言处理,第1张

pytorch概念与基本元素

是基于numpy的科学计算包,提供使用GPU能力的深度学习平台

关键元素:tensors张量,类似于ndarray


一、基本元素 *** 作

使用pytorch的时候首先要引入torch

from __future__ import print_function
#比当前版本的 python 更新的版本的print函数,可以不写
import torch
1、创建矩阵

未初始化矩阵里没有确切的值,分配给矩阵的内存中有什么数据就穿什么数据,是毫无意义的脏数据。


但是有初始化的时候以标准高斯分布重新赋值

指定数据元素用dtype

#创建没有初始化的空矩阵
x=torch.empty(5,3)#无行三列
print(x)
#有初始化
x=torch.rand(5,3)#随机生成
#有初始化的全零矩阵并且数据元素的类型为long(整型)
x=torch.zeros(5,3,dtype=torch.long)#用dtype来指定数据类型
#直接通过数据创建
#一个list通过tensor封装来传入直接构成矩阵
x=torch.tensor([2.5,3.5])
print(x)

torch.rand是包含了从区间[0, 1)的均匀分布中抽取的一组随机数

torch.randn是标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数

2、创建张量

通过已有的张量创建一个新的张量:首先构建全一的张量,再使用randn_like赋值并随机初始化赋值一个形状一样的张量

#new_methods方法创建新的张量
x=x.new_ones(5,3,dtype=torch.double)#浮点数,有小数点后一位
#randn_like方法创建新的张量,并random分布重新赋值
y=torch.randn_like(x,dtype=torch.float)
print(y.size()) #输出的是一个元组a,b=x.size

二、基本运算 *** 作 1、加法 *** 作

注意add的out参数,以及inplace系列 *** 作后面的小下划线

x=torch.rand(5,3)
y=torch.rand(5,3)
#形状相同的张量之间的加法 *** 作
print(x+y)
print(torch.add(x,y))
#或者提前设定一个空的张量,并把相加的结果赋值进去
result=torch.empty(5,3)
torch.add(x,y,out=result)#用out参数传输结果给空变量中
#或者原地置换,直接把结果存在y里面
y.add_(x)#注意有小下划线
#所有的inplace *** 作都是这样,有一个下划线的后缀,运算的结果直接存在这个变量中
2、改变形状(切片等)

python的切片 *** 作需要复习,view函数可以改变形状,但是需要保持里面的元素个数是相同的

item可以把单一值提取出来

x=torch.randn(5,3)
#使用numpy *** 作打印切片
print(x[:,1])#第一列
print(x[:,:3])#打印0,1,2三列

#使用view函数变换形状(注意需要保持元素总个数不变)
x=torch.randn(4,4)
y=x.view(16)
z=x.view(-1,8)#-1表示自动匹配,这里size输出就是(2,8)

#如果张量中只有一个值,则可以取出
x=torch.randn(1)
print(x)
print(x.item)
3、类型转换(tensor 与 array)

注意,torch tensor与numpy array共享底层存储空间,改变其中一个另一个也随之改变!

a=torch.ones(5)
print(a)
b=a.numpy()#简单的赋值 *** 作就可以改变
print(b)
a.add_(1)#a中所有元素都+1了
#因为numpy和torch里面所有元素底层都是共享的,所以赋值的b也会相应变化
#或者
np.add(a,1,out=a)

#np转torch
import numpy as np
a=np.ones(5)
b=torch.from_numpy(a)#转换
np.add(a,1,out=a)#加法,共享内存,ab都改变
4、张量移动P81.1类型转换

 

三、autograd

掌握自动求导中tensor和梯度gradients的概念与 *** 作

1、tensor

所有的Pytorch框架中,所有的神经网络都是自动求导工具包,TORCH.tensor是整个包中的核心类,将属性requires_grad设置为true(布尔类型),就会自动追踪这个类上定义的所有 *** 作。


当代码需要反向传播的时候可以直接调用.backward()自动计算梯度并加进.grad(存实数,数字化参数)里面

想终止回溯 *** 作就用.detach(),但是这个tensor就会被撤下,后面也不会再计算了。


或者用with torch.no_grad()代码块,适用于预测阶段不用对梯度进行计算

torch.fuction构成.grad_fn属性

x=torch.ones(2,2,requires_grad=True)#这个参数保证任意 *** 作可以回溯
#后面执行任意 *** 作,会增加一行输出grad_fn=这个是加法 *** 作,还有别的mul等
print(x)
y=x+2
print(y)
#如果是x衍生出来的别的tensor也会自动拥有grad_fn,打印出来是具体的数值
#自定义的变量打印出来就是none
z=y*y*3
out=z.mean()
print(z,out)

#此外,注意 *** 作后面_就表示原地 *** 作, *** 作之后就直接改变值
#如果最一开始定义torch的时候忘记requires_grad=True的话可以通过原地 *** 作重新自定义
a.requires_grad_(True)

 看输出的结果都带上了

2、gradients
out.backwards()
print(x.requires_grad)#true
print(x**2).requires_grad)#true

#通过代码块限制停止自动求导
with torch.no_grad():
   print((x**2).requires_grad)#false

#或者用detach()获得一个新的不需要自动求导的代码块
print(x.requires_grad)#true
y=x.detach()#将x的tensor从计算中拿掉

print(y.requires_grad)#false
print(x.eq(y).all)#tensor(True)
#即xy二者完全相同,只是有一个自动求导,一个不求

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存