Pytorch初见
文章目录
简介:深度之眼Pytorch框架班学习笔记
2017年 1 月, FAIR( FacebookAI Research )发布 PyTorch
PyTorch是在 Torch 基础上用python 语言重新打造的一款深度学习框架
Torch是采用 Lua 语言为接口的机器学习框架,但因 Lua 语言较为小众,导致 Torch 知名度不高
Why Pytorch?
-
上手快 :掌握 Numpy 和基本深度学习概念即可上手
-
代码简洁灵活 :用 nn.module 封装使网络搭建更方便;基于动态图机制,更灵活
-
Debug 方便 :调试 PyTorch 就像调试 Python 代码一样简单
-
文档规范 https://pytorch.org/docs/ 可查各版本文档
-
资源多 arXiv 中的新算法大多有 PyTorch 实现
-
开发者多 GitHub 上贡献者已超过 1100+
-
背靠大树 FaceBook 维护开发
Pytorch的张量
张量是什么?
张量是一个多维数组 ,它是标量、向量、矩阵的高维拓展
张量的创建
1 直接创建:
torch.tensor()
功能:从data 创建 tensor
- data : 数据 , 可以是 list, numpy
- dtype : 数据类型,默认与 data 的一致
- device 所在设备 , cuda cpu
- requires_grad :是否需要梯度
- pin_memory :是否存于锁页内存
2 依据数值创建
torch.zeros
功能:依size 创建全 0 张量
- size : 张量的形状 , 如 (3, 、 (3,
- out : 输出的张量
- layout 内存中布局形式 , 有
- strided,sparse_coo 等
- device 所在设备 , gpu cpu
- requires_grad :是否需要梯度
torch.zeros_like()
- 功能:依input形状创建全0张量
- intput: 创建与input同形状的全0张量
- dtype : 数据类型
- layout : 内存中布局形式
2.3 torch.ones()
2.4 torch.ones_like()
2.5 torch.full()
2.6 torch.full_like()
2.7 torch.arange()
功能:创建等差的1维张量
注意事项:数值区间为[start, end)
2.8 torch.linspace()
功能:创建均分的1维张量
注意事项:数值区间为[start, end]
2.9 torch.logspace()
功能:创建对数均分的1维张量
注意事项:长度为steps, 底为base
2.10 torch.eye()
功能:创建单位对角矩阵( 2维张量)
注意事项:默认为方阵
3 依概率分布创建张量
3.1 torch.normal()
功能:生成正态分布(高斯分布)
- mean : 均值
- std : 标准差
四种模式:
mean为标量,std为标量
mean为标量,std为张量
mean为张量,std为标量
mean为张量,std为张量
3.2 torch.randn()
3.3 torch.randn_like()
功能:生成标准正态分布
3.4 torch.rand()
3.5 torch.rand_like()
功能:在区间[0, 1)上,生成均匀分布
3.6 torch.randint()
3.7 torch.randint_like()
功能:区间[low, high)生成整数均匀分布
3.8 torch.randperm()
功能:生成生成从0到n-1的随机排列
3.9 torch.bernoulli()
功能:以input为概率,生成伯努力分布
(0-1分布,两点分布)
张量操作
张量拼接与切分
1.1 torch.cat()
功能:将张量按维度dim进行拼接
1.2 torch.stack()
功能:在新创建的维度dim上进行拼接
1.3 torch.chunk()
功能:将张量按维度dim进行平均切分
返回值:张量列表
注意事项:若不能整除,最后一份张量小于
其他张量
1.4 torch.split()
功能:将张量按维度dim进行切分
返回值:张量列表
张量索引
2.1 torch.index_select()
功能:在维度dim上,按index索引数据
返回值:依index索引数据拼接的张量
2.2 torch.masked_select()
功能:按mask中的True进行索引
返回值:一维张量
张量变换
3.1 torch.reshape()
功能:变换张量形状
注意事项:当张量在内存中是连续时,新张
量与input共享数据内存
3.2 torch.transpose()
功能:交换张量的两个维度
3.4 torch.squeeze()
功能:压缩长度为1的维度(轴)
dim: 若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除;
3.5 torch.unsqueeze()
功能:依据dim扩展维度
张量数学运算
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVkG4ica-1636977797700)(https://i.loli.net/2021/11/15/2VHtkSMmdP36cOs.png)]
计算图
计算图是用来描述运算的有向无环图
计算图有两个主要元素:结点(Node)和边(Edge)
结点表示数据,如向量,矩阵,张量
边表示运算,如加减乘除卷积等
计算图与梯度求导
动态图vs 静态图
Dynamic VS Static Computational Graphs
根据计算图搭建方式,可将计算图分为动态图和静态图
动态图:先搭建图,后运算
灵活 易调节
静态图:
运算与搭建同时进行
autograd-自动求导系统
torch.autograd.backward()
功能:自动求取梯度
- tensors: 用于求导的张量,如 loss
- retain_graph : 保存计算图
- create_graph : 创建导数计算图,用于高阶求导
- grad_tensors:多梯度权重
autograd小贴士:
- 梯度不自动清零
- 依赖于叶子结点的结点,requires_grad默认为True
autograd-自动求导系统
torch.autograd.backward()
功能:自动求取梯度
- tensors: 用于求导的张量,如 loss
- retain_graph : 保存计算图
- create_graph : 创建导数计算图,用于高阶求导
- grad_tensors:多梯度权重
autograd小贴士:
- 梯度不自动清零
- 依赖于叶子结点的结点,requires_grad默认为True
- 叶子结点不可执行in-place