课程链接: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
未初始化矩阵里没有确切的值,分配给矩阵的内存中有什么数据就穿什么数据,是毫无意义的脏数据。但是有初始化的时候以标准高斯分布重新赋值
指定数据元素用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,即高斯白噪声)中抽取的一组随机数
通过已有的张量创建一个新的张量:首先构建全一的张量,再使用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
注意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操作都是这样,有一个下划线的后缀,运算的结果直接存在这个变量中
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)
注意,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都改变
掌握自动求导中tensor和梯度gradients的概念与操作
所有的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)
看输出的结果都带上了
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二者完全相同,只是有一个自动求导,一个不求