【深度学习与NLP】——快速入门Pytorch基本语法

目录

Pytorch基本语法

1.1 认识Pytorch

1.1.1 什么是Pytorch

1.1.2 Pytorch的基本元素操作

1.1.3 Pytorch的基本运算操作

1.1.4 关于Torch Tensor和Numpy array之间的相互转换

1.1.5 小节总结

1.2 Pytorch中的autograd

1.2.1 关于torch.Tensor

1.2.2 关于Tensor的操作

1.2.3 关于梯度Gradients

1.2.4 小节总结


Pytorch基本语法

1.1 认识Pytorch

1.1.1 什么是Pytorch

  • Pytorch是一个基于Numpy的科学计算包, 向它的使用者提供了两大功能.
    • 作为Numpy的替代者, 向用户提供使用GPU强大功能的能力.
    • 做为一款深度学习的平台, 向用户提供最大的灵活性和速度.

1.1.2 Pytorch的基本元素操作

  • Tensors张量: 张量的概念类似于Numpy中的ndarray数据结构, 最大的区别在于Tensor可以利用GPU的加速功能.

  • 我们使用Pytorch的时候, 常规步骤是先将torch引用进来, 如下所示:

from __future__ import print_function
import torch
  • 创建矩阵的操作
  • 创建一个没有初始化的矩阵:
x = torch.empty(5, 3)
print(x)

  • 创建一个有初始化的矩阵:
x = torch.rand(5, 3)
print(x)

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

  • 创建一个全零矩阵并可指定数据元素的类型为long
x = torch.zeros(5, 3, dtype=torch.long)
print(x)

  • 直接通过数据创建张量
x = torch.tensor([2.5, 3.5])
print(x)

  • 通过已有的一个张量创建相同尺寸的新张量
# 利用news_methods方法得到一个张量
x = x.new_ones(5, 3, dtype=torch.double)
print(x)

# 利用randn_like方法得到相同张量尺寸的一个新张量, 并且采用随机初始化来对其赋值
y = torch.randn_like(x, dtype=torch.float)
print(y)

  • 得到张量的尺寸:
print(x.size())

  • 注意:
    • torch.Size函数本质上返回的是一个tuple, 因此它支持一切元组的操作.

1.1.3 Pytorch的基本运算操作

  • 加法操作:
y = torch.rand(5, 3)
print(x + y)

  • 第二种加法方式:
print(torch.add(x, y))

  • 第三种加法方式:
# 提前设定一个空的张量
result = torch.empty(5, 3)
# 将空的张量作为加法的结果存储张量
torch.add(x, y, out=result)
print(result)

  • 第四种加法方式: in-place (原地置换)
y.add_(x)
print(y)

  • 注意:
    • 所有in-place的操作函数都有一个下划线的后缀.
    • 比如x.copy_(y), x.add_(y), 都会直接改变x的值.
  •  用类似于Numpy的方式对张量进行操作:
  • 表示选取张量 x 的所有行的第 2 列(索引从 0 开始,所以第 1 列的索引是 1)。
print(x[:, 1])


  • 改变张量的形状: torch.view()
x = torch.randn(4, 4)
# tensor.view()操作需要保证数据元素的总数量不变
y = x.view(16)
# -1代表自动匹配个数
z = x.view(-1, 8)
print(x.size(), y.size(), z.size())

  • 如果张量中只有一个元素, 可以用.item()将值取出, 作为一个python number
x = torch.randn(1)
print(x)
print(x.item())

1.1.4 关于Torch Tensor和Numpy array之间的相互转换

  • Torch Tensor和Numpy array共享底层的内存空间, 因此改变其中一个的值, 另一个也会随之被改变.
a = torch.ones(5)
print(a)

  • 将Torch Tensor转换为Numpy array
b = a.numpy()
print(b)

  • 对其中一个进行加法操作, 另一个也随之被改变:
a.add_(1)
print(a)
print(b)

  • 将Numpy array转换为Torch Tensor:
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)

  • 注意:
    • 所有在CPU上的Tensors, 除了CharTensor, 都可以转换为Numpy array并可以反向转换.
  • 关于Cuda Tensor: Tensors可以用.to()方法来将其移动到任意设备上.
# 如果服务器上已经安装了GPU和CUDA
if torch.cuda.is_available():
    # 定义一个设备对象, 这里指定成CUDA, 即使用GPU
    device = torch.device("cuda")
    # 直接在GPU上创建一个Tensor
    y = torch.ones_like(x, device=device)
    # 将在CPU上面的x张量移动到GPU上面
    x = x.to(device)
    # x和y都在GPU上面, 才能支持加法运算
    z = x + y
    # 此处的张量z在GPU上面
    print(z)
    # 也可以将z转移到CPU上面, 并同时指定张量元素的数据类型
    print(z.to("cpu", torch.double))

输出结果:

tensor([0.6469], device='cuda:0')

tensor([0.6469], dtype=torch.float64)

1.1.5 小节总结

  • 学习了什么是Pytorch.

    • Pytorch是一个基于Numpy的科学计算包, 作为Numpy的替代者, 向用户提供使用GPU强大功能的能力.
    • 做为一款深度学习的平台, 向用户提供最大的灵活性和速度.
  • 学习了Pytorch的基本元素操作.

    • 矩阵的初始化:
      • 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()
  • 学习了Pytorch的基本运算操作.

    • 加法操作:
      • x + y
      • torch.add(x, y)
      • torch.add(x, y, out=result)
      • y.add_(x)
    • 其他若干操作:
      • x.view()
      • x.item()
  • 学习了Torch Tensor和Numpy Array之间的相互转换.

    • 将Torch Tensor转换为Numpy Array:
      • b = a.numpy()
    • 将Numpy Array转换为Torch Tensor:
      • b = torch.from_numpy(a)
    • 注意: 所有才CPU上的Tensor, 除了CharTensor, 都可以转换为Numpy Array并可以反向转换.
  • 学习了任意的Tensors可以用.to()方法来将其移动到任意设备上.

    • x = x.to(device)

1.2 Pytorch中的autograd

  • 掌握自动求导中的Tensor概念和操作.
  • 掌握自动求导中的梯度Gradients概念和操作.
  • 在整个Pytorch框架中, 所有的神经网络本质上都是一个autograd package(自动求导工具包)
    • autograd package提供了一个对Tensors上所有的操作进行自动微分的功能.

1.2.1 关于torch.Tensor

  • torch.Tensor是整个package中的核心类, 如果将属性.requires_grad设置为True, 它将追踪在这个类上定义的所有操作. 当代码要进行反向传播的时候, 直接调用.backward()就可以自动计算所有的梯度. 在这个Tensor上的所有梯度将被累加进属性.grad中.
  • 如果想终止一个Tensor在计算图中的追踪回溯, 只需要执行.detach()就可以将该Tensor从计算图中撤下, 在未来的回溯计算中也不会再计算该Tensor.
  • 除了.detach(), 如果想终止对计算图的回溯, 也就是不再进行方向传播求导数的过程, 也可以采用代码块的方式with torch.no_grad():, 这种方式非常适用于对模型进行预测的时候, 因为预测阶段不再需要对梯度进行计算.

  • 关于torch.Function:
    • Function类是和Tensor类同等重要的一个核心类, 它和Tensor共同构建了一个完整的类, 每一个Tensor拥有一个.grad_fn属性, 代表引用了哪个具体的Function创建了该Tensor.
    • 如果某个张量Tensor是用户自定义的, 则其对应的grad_fn is None.

1.2.2 关于Tensor的操作

x1 = torch.ones(3, 3)
print(x1)

x = torch.ones(2, 2, requires_grad=True)
print(x)

  • 在具有requires_grad=True的Tensor上执行一个加法操作
y = x + 2
print(y)

  • 打印Tensor的grad_fn属性:
print(x.grad_fn)
print(y.grad_fn)

  • 在Tensor上执行更复杂的操作:
z = y * y * 3
out = z.mean()
print(z, out)

  • 关于方法.requires_grad_(): 该方法可以原地改变Tensor的属性.requires_grad的值. 如果没有主动设定默认为False.
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)

1.2.3 关于梯度Gradients

  • 在Pytorch中, 反向传播是依靠.backward()实现的.
out.backward()
print(x.grad)

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

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

  • 可以通过.detach()获得一个新的Tensor, 拥有相同的内容但不需要自动求导.
print(x.requires_grad)
y = x.detach()
print(y.requires_grad)
print(x.eq(y).all())

1.2.4 小节总结

  • 学习了torch.Tensor类的相关概念.

    • torch.Tensor是整个package中的核心类, 如果将属性.requires_grad设置为True, 它将追踪在这个类上定义的所有操作. 当代码要进行反向传播的时候, 直接调用.backward()就可以自动计算所有的梯度. 在这个Tensor上的所有梯度将被累加进属性.grad中.
    • 执行.detach()命令, 可以将该Tensor从计算图中撤下, 在未来的回溯计算中不会再计算该Tensor.
    • 采用代码块的方式也可以终止对计算图的回溯:
      • with torch.no_grad():
  • 学习了关于Tensor的若干操作:

    • torch.ones(n, n, requires_grad=True)
    • x.grad_fn
    • a.requires_grad_(True)
  • 学习了关于Gradients的属性:

    • x.grad
    • 可以通过.detach()获得一个新的Tensor, 拥有相同的内容但不需要自动求导.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lingxw_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值