pytorch

一、PyTorch 是什么

PyTorch是一个基于Python的科学计算包,相比numpy能使用GPU来加快计算。

二、基本语法

介绍pytorch基本知识,对pytorch有基本的了解,构建基本的神经网络。主要参考pytorch官方教程。

2.1 张量(Tensors)

张量张量类似于numpy的ndarrays,不同之处在于张量可以使用GPU来加快计算。
对tensor的操作可分为两类:
(1)torch.function,如torch.save等。
(2)tensor.function,如a.view等。
说明:函数名以_结尾的都是inplace方式,即会修改调用者自己的数据,如a.add(b),加法的结果仍存储在a中,a被修改了。

创建Tensor

函数 说明
torch.tensor(data ) 赋值
torch.arange(start,end,step=1,out=None)
torch.zeros(*sizes ) 全部生成为0
torch.clone()
torch.ones(*sizes ) 全部生成为1
torch.eye(n,m=None,out=None) 返回一个2维张量,对角线位置全为1,其他位置全0
torch.from_numpy(ndarray) tensor和numpy的转换
torch.linspace(start, end, steps=100, out=None) 返回一个1维张量,包含在区间start和end上均匀间隔的step个点。
torch.logspace(start,end,steps=100.out=None) 设置的区间为常用对数,输出的值为其对应的真数

创建随机Tensor

函数 说明
torch.rand(*sizes, out=None) 从区间[0, 1)的均匀分布中抽取的一组随机数
torch.randperm(n,out=None) 返回一个从0到n-1的随机整数排列
torch.randn(*sizes, out=None) 从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数
torch.normal(means, std, out=None) 指定均值means和标准差std的离散正态分布中抽取的一组随机数。
uniform(from,to) 均匀分布

常用Tensor操作

函数 说明
view(*shape) 调整tensor的形状,与源tensor共享内存
torch.squeeze(input, dim=None, out=None) 删除尺寸1的输入的所有尺寸的张量
torch.unsqueeze(input, dim, out=None) 插入在指定位置的尺寸标注尺寸的新张量。
resize 修改tensor的尺寸
None 添加一个轴
a > 1 返回一个bool矩阵
gather(input, dim, index) 根据index,在dim维度上选取数据,输出的size与index一样
index_select(input, dim, index) 在指定维度dim上选取,比如选取某些行、某些列
masked_select(input, mask) 例子如上,a[a>0],使用ByteTensor进行选取
non_zero(input) 非0元素的下标

数值计算

函数 说明
abs/sqrt/div/exp/fmod/log/pow… 绝对值/平方根/除法/指数/求余/求幂…
cos/sin/asin/atan2/cosh… 相关三角函数
ceil/round/floor/trunc 上取整/四舍五入/下取整/只保留整数部分
clamp(input, min, max) 超过min和max部分截断
sigmod/tanh… 激活函数
torch.lerp(star, end, weight) 返回结果是out= star t+ (end-start) * weight
torch.equal(torch.Tensor(a), torch.Tensor(b)) 两个张量进行比较,如果相等返回true,否则返回false
torch.max(input) 返回输入元素的最大值
mean/sum/median/mode 均值/和/中位数/众数
norm/dist 范数/距离
std/var 标准差/方差
cumsum/cumprod 累加/累乘
gt/lt/ge/le/eq/ne 大于/小于/大于等于/小于等于/等于/不等
topk 最大的k个数
sort 排序
max/min 比较两个tensor最大最小值

线性代数计算

函数 说明
trace 对角线元素之和(矩阵的迹)
diag 对角线元素
triu/tril 矩阵的上三角/下三角,可指定偏移量
mm/bmm 矩阵乘法,batch的矩阵乘法
addmm/addbmm/addmv/addr/badbmm… 矩阵运算
t 转置
dot/cross 内积/外积
inverse 求逆矩阵
svd 奇异值分解

2.2 Autograd: 自动求导(automatic differentiation)

PyTorch在autograd模块中实现了计算图的相关功能,autograd中的核心数据结构是Variable。Variable 封装了tensor,并记录对tensor的操作记录用来构建计算图。Variable的数据结构如图3-4所示,主要包含三个属性。

  • data:保存variable所包含的tensor。
  • grad:保存data对应的梯度,grad也是variable,而非tensor,它与data形状一致。
  • grad_fn:指向一个Function,记录variable的操作历史,即它是什么操作的输出,用来构建计算图。如果某一个变量是由用户创建的,则它为叶子节点,对应的grad_fn等于None。

pytorch_第1张图片
Variable 支持大部分tensor支持的函数,但其不支持部分inplace函数,因为这些函数会修改tensor自身,而在反向传播中,variable需要缓存原来的tensor来计算梯度。
如果想要计算各个Variable的梯度,只需调用根节点variable的backward方法,autograd会自动沿着计算图反向传播,计算每一个叶子节点的梯度。

用out.backward()来执行反向传播。此Tensor的梯度将累积到.grad属性中。如果不想要被继续追踪,可以调用.detach()将其从追踪记录中分离出来,这样就可以防止将来的计算被追踪,这样梯度就传不过去了。此外,还可以用with torch.no_grad()将不想被追踪的操作代码块包裹起来,这种方法在评估模型的时候很常用,因为在评估模型时,我们并不需要计算可训练参数(requires_grad=True)的梯度。注意:grad在反向传播过程中是累加的(accumulated),这意味着每次运行反向传播,梯度都会累加之前的梯度,所以反向传播之前需把梯度清零x.grad.data.zero_()。

2.3 构建神经网络

autograd实现了自动微分系统,然而对于深度学习来说过于底层,其抽象程度较低,如果用其来实现深度学习模型,则需要编写的代码量极大。在这种情况下,torch.nn应运而生,其是专门为深度学习设计的模块。torch.nn的核心数据结构是Module,它是一个抽象的概念,既可以表示神经网络中的某个层(layer),也可以表示一个包含很多层的神经网络。

三、常用函数

索引,切片,连接,换位

函数 说明
torch.cat(inputs,dimension=0) 在给定维度上对输入的张量序列进行连接操作
torch.squeeze(inout,dim=None,out=None) 将输入张量形状中的1去除
torch.expand(*sizes) 单个维度扩大为更大的尺寸。
index_add_(dim, index, tensor) 按参数index中的索引数确定的顺序,将参数tensor中的元素加到原来的tensor中。
repeat(*sizes) 沿着指定的维度重复tensor。
torch.reshape(input, shape)

|.torch.transpose(input, dim0, dim1)|转置|
|.torch.masked_select(input, mask, out=None) |根据二进制掩码对输入进行索引,这是一个新的索引|
|torch.chunk(tensor, chunks, dim=0) |将张量拆分为特定数量的“块”|
|torch.narrow(input, dimension, start, length)|
|torch.stack(seq, dim=0, out=None) |拼接|

参考文献:
pytorch官网
深度学习框架pytorch:入门与实践
PyTorch 深度学习:60分钟快速入门
torch—pytorch常用函数
Pytorch常用函数操作总结

你可能感兴趣的:(科研软件笔记)