PyTorch

PyTorch是一个开源的python机器学习库

PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵

活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习

框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。

PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神

经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用

优点:

  1. PyTorch语法非常简洁并且高效
  2. 设计追求最少的封装
  3. 设计符合人类思维,它让用户尽可能地专注实现自己的想法
  4. Pytorch作者亲自维护社区
  5. 入门简单,便于学习

环境搭建

  1. 在conda环境中创建虚拟环境
  1. conda create -n torchenv python=3.8
  1. 激活当前环境
  1. conda activate torchenv
  1. 访问pytorch的官网pytorch.org 按照官网提示选择对应的版本进行安装

注:如果您的电脑支持CUDA并且显存大于2G,可以安装CUDA版本,在机器学习的过程中效率会高一点

06_pytorch环境与张量 - 图1

同时我们还需要安装Cuda驱动, 我安装的是cuda11 所以上面我选的也是11

  1. cuda_11.4.0_471.11_win10.exe

如果您的电脑显卡不支持cuda,那还可以安装CPU版本

06_pytorch环境与张量 - 图2

在虚拟环境中安装jupyter notebook

  1. pip install jupyter

安装jupyter notebook的提示功能

  1. pip install jupyter_contrib_nbextensions
  2. jupyter contrib nbextension install --user
  3. pip install --user jupyter_nbextensions_configurator
  4. jupyter nbextensions_configurator enable --user

在命令行中启动jupyter notebook

06_pytorch环境与张量 - 图3

下面我们就从Pytorch中最最基础的类型开始进行学习,只要大家认真跟着本系列教程学习,多加练习,相信大家对机器学习有一个直观的认识。

张量

PyTorch中的所有操作都是在张量的基础上进行的, 本实验主要讲解了张量的定义和相关张量操作以及GPU和张量之间的关系, 为以后使用PyTorch进行深度学习打下坚实的基础

张量的定义

PyTorch中所有内容都基于Tensor张量来操作的.张量可以鱼油不同的尺寸,可以是1维,2维,3维,甚至N维的数据.下面我们就一起来学习一下张量的定义

  1. import torch
  2. x = torch.empty(1)
  3. print(x.size())
  4. y = torch.empty(3)
  5. print(y.size())
  6. z = torch.empty(2,3)
  7. print(z.size())
  1. 创建随机的张量
  1. torch.randn(2,3) # 初始化一个符合正态分布的张量
  1. 创建全0或者全1的张量
  1. a = torch.zeros(2,3)
  2. b = torch.ones(2,3)
  1. 获取张量的大小/尺寸
  1. a.size()
  1. 查看张量的数据类型
  1. a.dtype
  1. 在创建张量的时候,指定类型
  1. a = torch.zeros(2,3,dtype=torch.float16)
  2. print(a)
  3. print(a.dtype)
  1. 创建指定值的张量,我们需要用到torch.tensor(list)
  1. x = torch.tensor([5.5, 3])
  1. 如果想定义的张量能够自动计算梯度,那么我们就需要将参数requires_grad置为True
  1. torch.tensor([5.5, 3], requires_grad=True)

张量的运算

  1. 加法
  1. x = torch.rand(2, 2)
  2. y = torch.rand(2, 2)
  3. z = x + y
  4. print(z)
  1. 减法
  1. z = x - y
  2. print(z)
  3. z = torch.sub(x,y)
  4. print(z)
  1. 乘法
  1. z = x * y
  2. print(z)
  3. z = torch.mul(x, y)
  4. print(z)
  1. 除法
  1. z = x / y
  2. print(z)
  3. z = torch.div(x, y)
  4. print(z)

张量的切片

  1. x = torch.rand(5,3)
  2. print(x)
  3. print(x[1, 1])
  4. print(x[:, 0])
  5. print(x[1, :])

张量的形变

将原张量的形状进行变换,即元素总个数不变的情况下改变行数和列数, 使用torch.view(size)类似numpy.reshape

  1. x = torch.randn(4, 4)
  2. y = x.view(16)
  3. z = x.view(2, 8)
  4. print(x.size(), y.size(), z.size())

例如x的形状为12 x 23 x 100, 而我们想把x转为2 x M 的大小时,我们就必须手动算出12 x 23 x 100 的值, 然后除以2, 进而得到M的值

为了避免这种情况, 我们可以将M所在位置赋值为-1. 计算机看到-1时, 会自动使用12 x 23 x 100 / 2 的值来替换-1

  1. x = torch.randn(12,13,100)
  2. y = x.view(2,-1)
  3. print(x.size(), y.size())

Numpy与Tensor的互转

使用tensor.numpy() 将Tensor类型的变量转为Numpy类型:

  1. a = torch.ones(5)
  2. print(a)
  3. b = a.numpy()
  4. print(type(b))

使用torch.from_numpy() 将Numpy类型转为Tensor:

  1. import numpy as np
  2. a = np.ones(5)
  3. b = torch.from_numpy(a)
  4. print(type(b))