当前位置:   article > 正文

1.语法与入门-pytorch与自然语言处理_未被初始化的矩阵区别pytorch

未被初始化的矩阵区别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

  1. from __future__ import print_function
  2. #比当前版本的 python 更新的版本的print函数,可以不写
  3. import torch

1、创建矩阵

未初始化矩阵里没有确切的值,分配给矩阵的内存中有什么数据就穿什么数据,是毫无意义的脏数据。但是有初始化的时候以标准高斯分布重新赋值

指定数据元素用dtype

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

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

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

2、创建张量

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

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

二、基本运算操作

1、加法操作

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

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

2、改变形状(切片等)

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

item可以把单一值提取出来

  1. x=torch.randn(5,3)
  2. #使用numpy操作打印切片
  3. print(x[:,1])#第一列
  4. print(x[:,:3])#打印0,1,2三列
  5. #使用view函数变换形状(注意需要保持元素总个数不变)
  6. x=torch.randn(4,4)
  7. y=x.view(16)
  8. z=x.view(-1,8)#-1表示自动匹配,这里size输出就是(2,8)
  9. #如果张量中只有一个值,则可以取出
  10. x=torch.randn(1)
  11. print(x)
  12. print(x.item)

3、类型转换(tensor 与 array)

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

  1. a=torch.ones(5)
  2. print(a)
  3. b=a.numpy()#简单的赋值操作就可以改变
  4. print(b)
  5. a.add_(1)#a中所有元素都+1了
  6. #因为numpy和torch里面所有元素底层都是共享的,所以赋值的b也会相应变化
  7. #或者
  8. np.add(a,1,out=a)
  9. #np转torch
  10. import numpy as np
  11. a=np.ones(5)
  12. b=torch.from_numpy(a)#转换
  13. 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属性

  1. x=torch.ones(2,2,requires_grad=True)#这个参数保证任意操作可以回溯
  2. #后面执行任意操作,会增加一行输出grad_fn=<AddBackward0>这个是加法操作,还有别的mul等
  3. print(x)
  4. y=x+2
  5. print(y)
  6. #如果是x衍生出来的别的tensor也会自动拥有grad_fn,打印出来是具体的数值
  7. #自定义的变量打印出来就是none
  8. z=y*y*3
  9. out=z.mean()
  10. print(z,out)
  11. #此外,注意操作后面_就表示原地操作,操作之后就直接改变值
  12. #如果最一开始定义torch的时候忘记requires_grad=True的话可以通过原地操作重新自定义
  13. a.requires_grad_(True)

 看输出的结果都带上了<XXXXbackward0>

2、gradients

  1. out.backwards()
  2. print(x.requires_grad)#true
  3. print(x**2).requires_grad)#true
  4. #通过代码块限制停止自动求导
  5. with torch.no_grad():
  6. print((x**2).requires_grad)#false
  7. #或者用detach()获得一个新的不需要自动求导的代码块
  8. print(x.requires_grad)#true
  9. y=x.detach()#将x的tensor从计算中拿掉
  10. print(y.requires_grad)#false
  11. print(x.eq(y).all)#tensor(True)
  12. #即xy二者完全相同,只是有一个自动求导,一个不求

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/356125
推荐阅读
相关标签
  

闽ICP备14008679号