PyTorch
PyTorch是一个开源的python机器学习库
PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵
活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习
框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。
PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神
经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用
优点:
- PyTorch语法非常简洁并且高效
- 设计追求最少的封装
- 设计符合人类思维,它让用户尽可能地专注实现自己的想法
- Pytorch作者亲自维护社区
- 入门简单,便于学习
环境搭建
- 在conda环境中创建虚拟环境
conda create -n torchenv python=3.8
- 激活当前环境
conda activate torchenv
- 访问pytorch的官网
pytorch.org
按照官网提示选择对应的版本进行安装
注:如果您的电脑支持CUDA并且显存大于2G,可以安装CUDA版本,在机器学习的过程中效率会高一点
同时我们还需要安装Cuda驱动, 我安装的是cuda11 所以上面我选的也是11
cuda_11.4.0_471.11_win10.exe
如果您的电脑显卡不支持cuda,那还可以安装CPU版本
在虚拟环境中安装jupyter notebook
pip install jupyter
安装jupyter notebook的提示功能
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install --user jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
在命令行中启动jupyter notebook
下面我们就从Pytorch中最最基础的类型开始进行学习,只要大家认真跟着本系列教程学习,多加练习,相信大家对机器学习有一个直观的认识。
张量
PyTorch中的所有操作都是在张量的基础上进行的, 本实验主要讲解了张量的定义和相关张量操作以及GPU和张量之间的关系, 为以后使用PyTorch进行深度学习打下坚实的基础
张量的定义
PyTorch中所有内容都基于Tensor张量来操作的.张量可以鱼油不同的尺寸,可以是1维,2维,3维,甚至N维的数据.下面我们就一起来学习一下张量的定义
import torch
x = torch.empty(1)
print(x.size())
y = torch.empty(3)
print(y.size())
z = torch.empty(2,3)
print(z.size())
- 创建随机的张量
torch.randn(2,3) # 初始化一个符合正态分布的张量
- 创建全0或者全1的张量
a = torch.zeros(2,3)
b = torch.ones(2,3)
- 获取张量的大小/尺寸
a.size()
- 查看张量的数据类型
a.dtype
- 在创建张量的时候,指定类型
a = torch.zeros(2,3,dtype=torch.float16)
print(a)
print(a.dtype)
- 创建指定值的张量,我们需要用到torch.tensor(list)
x = torch.tensor([5.5, 3])
- 如果想定义的张量能够自动计算梯度,那么我们就需要将参数requires_grad置为True
torch.tensor([5.5, 3], requires_grad=True)
张量的运算
- 加法
x = torch.rand(2, 2)
y = torch.rand(2, 2)
z = x + y
print(z)
- 减法
z = x - y
print(z)
z = torch.sub(x,y)
print(z)
- 乘法
z = x * y
print(z)
z = torch.mul(x, y)
print(z)
- 除法
z = x / y
print(z)
z = torch.div(x, y)
print(z)
张量的切片
x = torch.rand(5,3)
print(x)
print(x[1, 1])
print(x[:, 0])
print(x[1, :])
张量的形变
将原张量的形状进行变换,即元素总个数不变的情况下改变行数和列数, 使用torch.view(size)类似numpy.reshape
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(2, 8)
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
x = torch.randn(12,13,100)
y = x.view(2,-1)
print(x.size(), y.size())
Numpy与Tensor的互转
使用tensor.numpy() 将Tensor类型的变量转为Numpy类型:
a = torch.ones(5)
print(a)
b = a.numpy()
print(type(b))
使用torch.from_numpy() 将Numpy类型转为Tensor:
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(type(b))