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

 课程链接:Python人工智能20个小时玩转NLP自然语言处理【黑马程序员】_哔哩哔哩_bilibili

本系列是自己记的课程笔记

pytorch概念与基本元素

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

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

目录

一、基本元素操作

1、创建矩阵

2、创建张量

二、基本运算操作

1、加法操作

2、改变形状(切片等)

3、类型转换(tensor 与 array)

4、张量移动P81.1类型转换

 三、autograd

1、tensor

2、gradients


一、基本元素操作

使用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类型转换

1.语法与入门-pytorch与自然语言处理_第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)

1.语法与入门-pytorch与自然语言处理_第2张图片

 看输出的结果都带上了

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二者完全相同,只是有一个自动求导,一个不求

1.语法与入门-pytorch与自然语言处理_第3张图片

你可能感兴趣的:(pytorch与自然语言处理,python)