当前位置:   article > 正文

【黑马程序员自然语言处理实战课程】学习笔记---pytorch基础知识和autograd_自然语言处理 黑马

自然语言处理 黑马

目录

1.1什么是pytorch

 1.2pytorch基础语法

 1.3pytorch基本运算

1.4关于torch tensor和numpy array之间的相互转换

2.1autograd基础概念

2.2 关于tensor操作 


1.1什么是pytorch

pytorch是一个基于Numpy的科学计算包,向他的使用者提供两大功能

  • 作为numpy的替代者,向用户提供GPU强大功能的能力;
  • 作为一款深度学习的平台,向用户提供最大的灵活性和速度

pytorch基本元素操作:

  • tensor张量:类似于numpy中的ndarray数据结构,最大区别在于tensor可以利用GPU的加速功能。
  • 需要先将torch引用进来
    1. from __future__ import print_function
    2. import torch

 1.2pytorch基础语法

  •  创建一个没有初始化的矩阵
  1. x = torch.empty(5,3)
  2. print(x)
  • 创建一个有初始化的矩阵
    1. y=torch.rand(5,3)
    2. print(y)

     注意:对比有无初始化矩阵:当声明一个未初始化的矩阵时,它本身不包含任何确切的值,当创建一个未初始化的矩阵时,分配给矩阵的内存中有什么数值就赋值给这个矩阵,本质上是毫无意义的数据

  • 创建一个全零 矩阵并可指定数据元素的类型为long

    1. z=torch.zeros(5,3,dtype=torch.long)
    2. print(z)
  • 直接通过数据创建张量
  1. a=torch.tensor([2.5,3.5])
  2. print(a)
  •  通过已有的一个张量创建相同尺寸的张量

 1.3pytorch基本运算

  • 加法操作
  1. # 第一种加法
  2. x=torch.rand(5,3)
  3. y=torch.rand(5,3)
  4. print(x+y)
  5. print('*********************')
  6. # 第二种加法
  7. print(torch.add(x,y))
  8. print('*********************')
  9. # 第三种加法
  10. # 提前设定一个空张量
  11. result=torch.empty(5,3)
  12. # 将空的张量作为加法的结果存储张量
  13. torch.add(x,y,out=result)
  14. print(result)
  15. print('*********************')
  16. # 第四种加法
  17. y.add_(x)
  18. print(y)

注意:所有in-place的操作函数都有一个下划线的后缀;比如:x.copy_(y)x,x.add_(y),都会直接改变x的值。

  • 用类似numpy方式进行张量积算
  1. x=torch.empty(5,3)
  2. print(x[:,:3])
  • 改变张量的形状:torch.view()
  1. x=torch.randn(4,4)
  2. # tensor.view()操作需要保证数据元素的总数量不变
  3. y=x.view(16)
  4. # -1代表自动匹配个数
  5. z=x.view(-1,8)
  6. print(x.size(),y.size(),z.size())
  • 如果张量中只有一个元素,可以用.item()值取出,作为一个python number
  1. x=torch.randn(1)
  2. print(x)
  3. print(x.item())

1.4关于torch tensor和numpy array之间的相互转换

  • torch tensor和numpy array共享底层的内存空间,因此改变其中一个值,另一个也随之被改变。
  1. a=torch.ones(5)
  2. print(a)
  3. #将torch tensor转换成numpy array
  4. b=a.numpy()
  5. print(b)
  6. # 对其中一个做加法操作,另一个随之改变
  7. a.add_(1)
  8. print(a)
  9. print(b)
  • 将numpy转化为torch
  1. import numpy as np
  2. a=np.ones(5)
  3. b=torch.from_numpy(a)
  4. np.add(a,1,out=a)
  5. print(a)
  6. print(b)

注意:所有的CPU上的tensors,除了CharTensor,都可以转换成numpy array 并可以反向转换

关于Cuda tensor:Tensor可以用.to()方法来将其移动到任意设备上

  1. import torch
  2. x=torch.randn(4,4)
  3. # 如果服务器已经安装了cuda
  4. if torch.cuda.is_available():
  5. # 定义一个设备对象,这里指定成CUDA,即使用GPU
  6. device=torch.device("cuda")
  7. # 直接在GPU上创建一个Tensor
  8. y=torch.ones_like(x,device=device)
  9. # 将在CPU上的x张量移动到GPU上?
  10. x=torch.to(device)
  11. # x和y都在GPU上,才能支持加法运算
  12. z=x+y
  13. print(z)
  14. # 也可以将z转移到CPU上面,并同时指定张量元素的数据类型
  15. print(z.to("cpu",torch.double))

小节总结:

基本元素操作:

矩阵初始化:

  • torch.empty()
  • torch.rand(n,m)
  • torch.zeros(n,m,dtype=torch.long)

其他若干操作:

  • x.new_ones(n,m,dtype=torch.double)
  • torch.randn_like(x,dtype=torch.float)
  • x.size()

加法操作:

  • x+y
  • torch.add(x,y)
  • torch.add(x,y,out=result)
  • y.add_(x)

其他若干操作:

  • x.view()
  • x.item()

相互转换:

  • b=a.numpy()
  • b=torch.from_numpy(a)

移动到任意设备之上:

  • x=x.to(device)

2.1autograd基础概念

在pytorch框架中,所有神经网络本质上都是autograd package(自动求导工具包)

提供一个对tensor上所有操作自动微分的功能

2.2 关于tensor操作 

  1. import torch
  2. x=torch.ones(3,3)
  3. print(x)
  4. y=torch.ones(2,2,requires_grad=True)
  5. print(y)
  6. # 在具有requires_grad=True的tensor上执行一个加法操作。
  7. z=y+2
  8. print(z)
  9. # 打印tensor的grad_fn属性
  10. print(x.grad_fn)
  11. print(y.grad_fn)

在tensor执行更复杂的操作:

  1. z=y*y*3
  2. out=z.mean()
  3. print(z,out)

关于require_grad_():该方法可以原地改变tensor的属性,requires_grad的值,如果没有主动设定默认为False.

  1. a=torch.randn(2,2)
  2. a=((a*3)/(a-1))
  3. print(a.requires_grad)
  4. a.requires_grad_(True)
  5. print(a.requires_grad)
  6. b=(a*a).sum()
  7. print(b.grad_fn)

2.3 关于梯度Gradients

在python中,反向传播是依靠.backward()实现的

  1. out.backward()
  2. print(x.grad)

关于自动求导的属性设置:可以通过设置.requires_grad=True来执行自动求导,也可以通过代码块的限制来停止自动求导。

  1. print(x.requires_grad)
  2. print((x**2).requires_grad)
  3. with torch.no_grad():
  4. print((x**2).requires_grad)

还可以通过.detach()获得一个新的tensor,拥有相同的内容但不需要自动求导

  1. print(x.requires_grad)
  2. y=x.detach()
  3. print(y.requires_grad)
  4. print(x.eq(y).all())

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

闽ICP备14008679号