赞
踩
课程链接:Python人工智能20个小时玩转NLP自然语言处理【黑马程序员】_哔哩哔哩_bilibili
本系列是自己记的课程笔记
pytorch概念与基本元素
是基于numpy的科学计算包,提供使用GPU能力的深度学习平台
关键元素:tensors张量,类似于ndarray
目录
使用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=<AddBackward0>这个是加法操作,还有别的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)
看输出的结果都带上了<XXXXbackward0>
- 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二者完全相同,只是有一个自动求导,一个不求
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。