Pytorch

1.Tensor的基本定义:

1.1tensor的创建

函数 功能 函数 功能
torch.Tensor(*size) 基础构造函数 torch.arange(s,e,step) 从s到e,步长为step
torch.Tensor(data) 类似np.array torch.linspace(s,e,steps) 从s到e,均匀分成steps份
torch.ones(*size) 全1Tensor torch.rand/randn(*size) 均匀/标准分布
torch.zeros(*size) 全0Tensor torch.normal(mean,std)/uniforms_(from,to) 正态分布/均匀分布
torch.eye(*size) 对角线为1,其余为0 torch.randperm(n) 生成一组从0到n-1的随机序列

1.2tensor的运算

1.2.1四则运算

运算符 torch 点运算 in-place运算(值直接赋予a)
加法运算 c=a+b c=torch.add(a,b) c=a.add(b) a.add_(b)
减法运算 c=a-b c=torch.sub(a,b) c=a.sub(b) a.sub_(b)
乘法运算(哈达玛积) c=a*b c=torch.mul(a,b) c=a.mul(b) a.mul_(b)
除法运算 c=a/b c=torch.div(a,b) c=a.div(b) a.div_(b)

1.2.2 算数运算

运算符 torch 点运算 in-place运算
矩阵运算 c=a@b c=torch.mm(a,b)/c=torch.matmul(a,b) c=a.mm(b)/c=a.matmul(b)
幂运算 c=a**2 c=torch.pow(a,2) c=a.pow(2) a.pow_(2)
e的幂运算 c=torch.exp(a) a.exp_()
开方运算 c=a.sqrt() a.sqrt_()
对数运算 torch.log()/torch.log2()/torch.log10() a.log_()

备注:矩阵运算时,当维度大于2,其只在最后两维度进行运算,前面的维度必须保持一致

1.2.3广播运算

右对齐原则,如果低维的和高维的最右边对齐,其对应维度值相等或其中一个为1,则可以进行广播运算,运算结果的形状为其中不为一

如形状:[2,3,1,5]和 [5,1] 则结果形状为【2,3,5,5】

​ [2,3,1,5]和[5,2]不可进行广播运算

1.2.4取余取整运算

函数 功能
torch.floor() 向下取整(不大于数的最大值)
torch.ceil() 向上取整(大于数的最小整数)
torch.roundn() 四舍五入取整
torch.trunc() 裁剪,只取整数部分
torch.frac() 裁剪,只取小数部分
% 取余

1.2.5比较运算

函数 功能
torch.eq(input,other) 按元素比较,返回一个矩阵,相同为True,不同为False
torch.equal(tensor1,tensor2) 整个张量进行比较,相同返回True,不同返回False
torch.ge(input,other) 按元素比较,返回一个矩阵,inpu t>= other为True,否则为False
torch.gt(input,other) 按元素比较,返回一个矩阵,input > other为True,否则为False
torch.le(input,other) 按元素比较,返回一个矩阵,input <= other为True,否则为False
torch.lt(input,other) 按元素比较,返回一个矩阵,input < other为True,否则为False
torch.ne(input,other) 按元素比较,返回一个矩阵,input != other为True,否则为False

备注:torch.isfinite(tensor) 判断是否为有界张量

​ torch.isfinf(tensor) 判断是否为无界张量

​ torch.isnan(tensor) 判断是否为nan张量

1.2.6排序运算

函数 功能
torch.sort(input,dim=None,descending=Flase) 对input排序,dim维度,descendin升序或降序
torch.topk(input,k,dim=None,largest=True,sorted=True) 沿着指定维度返回最大的k个数值及其索引
torch.kthvalue(input,k,dim=None) 沿着指定维度返回第k个最小值及其索引

1.2.7三角函数

函数 名称 函数 名称
torch.abs(input) 绝对值 torch.sinh(input) 双曲正弦
torch.cos(input) 余弦 torch.atan(input) 反正切
torch.acos(input) 反余弦 torch.atan2(input)
torch.cosh(input) 双曲余弦 torch.tan(input) 正切
torch.asin(input) 反正弦 torch.tanh(input) 双曲正切
torch.sin(input) 正弦

1.2.8其他数学函数

函数
torch.abs() torch.sign()
torch.erf() torch.lerp()
torch.erfinv() torch.addcdiv()
torch.sigmoid() torch.addcmul()
torch.neg() torch.cumprod()
torch.reciprocal() torch.cumsum()
torch.rsqrt()

1.3Pytorch统计学中函数

1.3.1基础函数

函数 功能
torch.mean() 返回平均值
torch.sum() 返回所有元素之和
torch.prod() 返回所有元素之积
torch.max() 返回最大值
torch.min() 返回最小值
torch.argmax() 返回最大值排序的索引
torch.argmin() 返回最小值排序的索引
torch.std() 返回标准差
torch.var() 返回方差
torch.median() 返回中间值
torch.mode() 返回中书值
torch.histc() 计算input直方图
torch.bincount() 返回每个值的频数

1.3.2随机种子定义

torch.manual_seed()

1.3.3范数计算

函数 功能
torch.dist(input,other,p=2) 计算P范数,主要用来衡量两个矩阵的相似性
torch.norm(a,p=2) 计算范数

1.4矩阵分解

1.4.1EVD分解(特征值分解)

PCA:将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征

PCA算法的优化目标就是:

(1)降维后同一纬度的方差最大

(2)不同维度之间的相关性为0

(3)协方差矩阵

1.4.2SVD分解(奇异值分解)

优化目标:

(1)同类间距尽可能小

(2)不同类间距尽可能大

目标函数:
Font metrics not found for font: .
类间距/类内距,求目标函数的最大值

pytorch实现

pytorch.svd()

1.4.3Tensor裁剪运算

a.clamp(2,10)限制范围

1.4.4Tensor的索引与数据筛选

函数 功能
torch.where(condition, x, y) 按照条件从x和y中选出满足条件的元素组成新的tensor
torch.gather(input, dim, index, out=None) 在指定维度上按照索引赋值输出tensor
tensor.torch.index_select(input, dim, index, out=None) 按照指定索引输出tensor
torch.masked_select(input, mask, out=None) 按照mask输出tensor,输出为向量
torch.take(input, indices) 将输入看成1D-tensor,按照索引得到输出tensor
torch.nonzero(input, out=None) 输出非0元素的坐标

1.4.5Tensor组合和拼接

函数 功能
torch.cat(eq, dim=O, out=None) 按照已经存在的维度进行拼接
torch.stack(seq, dim=0, out=None) 按照新的维度进行拼接
torch.gather(input, dim, index, out=None) 在指定维度上按照索引赋值输出tensor

1.4.6Tensor的切片

函数 功能
torch.chunk(tensor, chunks, dim=O) 按照某个维度平均分块(最后一个可能小于平均值)
torch.split(tensor, split_size_or_sections, dim=0) 按照某个维度依照第二个参数给出的list或者int进行分割tensor

1.4.7Tensor的变形操作

函数 功能
torch.reshape(input, shape)
torch.t(input) 只针对2D tensor转置
torch.transpose(input, dimO, dim1) 交换两个维度
torch.squeeze(input, dim=None, out=None) 去除那些维度大小为1的维度
torch.unbind(tensor, dim=O) 去除某个维度
torch.unsqueeze(input, dim, out=None) 在指定位置添加维度
torch.flip(input,dims) 按照给定维度进行翻转
torch.rot90(input,k,dims) 指定维度和旋转次数进行张量旋转

1.4.8Tensor数据填充

torch.full(10,size):定义全为10的矩阵

1.4.9Tensor频谱操作

函数 功能
torch.fft(input, signal_ndim, normalized=False) 傅里叶变换
torch.ifft(input, signal_ndim, normalized=False) 短时傅里叶变换
torch.rfft(input, signal_ndim, normalized=False, onesided=True) 快速傅里叶变换
torch.irfft(input, signal_ndim, normalized=False, onesided=True) 傅里叶反变换
torch.stft(signa, frame_length, hop,…) 快速傅里叶反变换

2.Pytorch模型搭建

2.1简单编程技巧

2.1.1模型的保存和加载

函数 功能
torch.saves(state, dir) 保存/序列化
torch.load(dir) 加载模型

2.1.2并行化

函数 功能
torch.get_num_threads() 获得用于并行化CPU操作的OpenMP线程数
torch.set_num_threads(int) 设定用于并行化CPU操作的OpenMP线程数

2.1.3分布式

python在默认情况下只使用一个GPU,在多个GPU的情况下就需要使用pytorch提供的DataParallelb

单机多卡

多机多卡

2.1.4Tensor GPU

用方法to()可以将Tensor在CPU和GPU(需要硬件支持)之间相互移动

2.1.5Tensor的相关配置

函数 功能
torch.is_tensor() 如果是pytorch的tensor类torch.is_tensor()型返回true
torch.is_storage() 如果是pytorch的storage类型返回ture
torch.set_flush_denormal(mode) 防止一些不正常的元素产生
torch.set_default_dtype(d) 对torch.tensor()设置默认的浮点类型
torch.set_printoptions(precision=None, threshold=None,edgeitems=None, linewidth=None, profile=None) 设置printing的打印参数

2.1.6与numpy互相转化

函数 功能
torch.from_numpy(ndarry) 将numpy转化成Tensor
a.numpy() 将Tensor转化成numpy

2.1.7Variable与Tensor

目前Variable已经与Tensor合并。

每个tensor通过requires_grad来设置是否计算梯度。

用来冻结某些层的参数

2.1.8Autograd的几个基本概念

2.1.8.1grad Vs grad_fn

grad:该Tensor的梯度值,每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加。

grad_fn:叶子节点通常为None,只有结果节点的grad_tn才有效,用于指示梯度函数是哪种类型。

2.1.8.2backward函数

torch.autograd.backward(tensors,grad_tensors=None,retain_graph=None,create_graph=False)

​ tensor:用于计算梯度的tensor,torch.autograd.backward(z)==z.backward()

​ grad_tensors:在计算矩阵的梯度时会用到。他其实也是一个tensor,shape一般需要和前面的tensor保持一致。

​ retain_graph:通常在调用一次backward后,pytorch会自动把计算图销毁,所以要想对某个变量重复调用backward,则需要将该参数 设置为True

​ create_graph: 如果为True,那么就创建一个专门的graph of thederivative,这可以方便计算高阶微分。

2.1.8.3torch.autograd.grad()函数

def grad(outputs, inputs, grad_outputs=NOne,iela._grp create_graph=False, only_inputs=True, allow_unused=False)

计算和返回output关于inputs的梯度的和。

outputs:函数的因变量,即需要求导的那个函数

inputs :函数的自变量

grad_outputs:同backward

only_inputs:只计算input的梯度

allow_unused( bool,可选)∶如果为False,当计算输出出错时(因此他们的梯度永远是0)指明不使用的inputs。

2.1.8.4torch.autograd包中的其他函数

torch.autograd.enable_grad:启动梯度计算的上下文管理器

torch.autograd.no_grad :禁止梯度计算的上下文管理器

torch.autograd.set grad_enabled(mode):设置是否进行梯度计算的上下文管理器

2.1.8.5torch.autograd.Function

每一个原始的自动求导运算实际上是两个在Tensor上运行的函数

​ forward函数计算从输入Tensors获得的输出Tensors

​ backward函数接收输出Tensors对于某个标量值的梯度,并且计算输入Tensors相对于该相同标量值的梯度

​ 最后,利用apply方法执行相应的运算

​ 定义在Function类的父类_FunctionBase中定义的一个方法

2.2nn库

2.2.1nn.Parameter

定义可训练参数

self.my_param = nn.Parameter(torch.randn(1))self.register_parameter

nn.ParameterList & nn.ParameterDict 通过列表和字典定义参数

2.2.2nn.Module

nn.Linear&nn.conv2d&nn.Relu&nn.MaxPool2d(2)&nn.MSEloss等等均继承父类nn.Module

各种神经网络层的定义,继承于nn.Module的子类.self.conv1 = nn.Conv2d(1,6,(5,5))

​ 调用时: self.conv1(x)

参数为parameter类型

layer = nn.Linear(1,1)

layer = nn.Linear(1,1)layer.weight = nn.Parameter(torch.FloatTensor([[O]]))

layer.bias = nn.Parameter(torch.FloatTensor([0]))

2.2.3nn.functional

(1)包含torch.nn库中所有函数,包含大量loss和activation function

​ torch.nn.functional.conv2d(input, weight, bias=None,

​ stride=1, padding=O, dilation=1, groups=1)

(2)nn.functional.xxx是函数接口

(3)nn.functional.xxx无法与nn.Sequential结合使用·没有学习参数的(eg. maxpool, loss_func,

activation func)等根据个人选择使用nn.functional.xxx 或nn.Xxx

(4)需要特别注意dropout层

(5)nn 与nn.functional有什么区别?

nn.functional.xxx是函数接口

nn.XxX是.nn.tunctional.XXX的犬到衣,7TI—"A RP了于一个共同祖先nn.Module

nn.Xxx除了具有nn.functional.xxx功能之外,内部附带nn.Module相关的属性和方法,eg. train(), eval(),load_state_dict, state_dict

2.2.4nn.Sequential

用于定义神经网络的序列,也可以通过字典来定义序列

2.2.5nn.ModuleList&nn.ModuleDict

2.2.6nn.Module

它是一个抽象概念,既可以表示神经网络中的某个层(layer),也可以表示一个包含很多层的神经网络

model.parameters()可训练参数

model.buffers()不可训练参数

model.state_dict()访问网络结构中的所有参数

model.modules()

forward(), to()
https://pytorch.org/docs/stable/nn.htmI#torch.nn.Module

2.2.7torchvision

torchvision主要包括一下几个包:

(1)vision.datasets:几个常用视觉数据集,可以下载和加载

(2)vision.models:已经训练好的模型,例如: AlexNet, VGG,ResNet

(3)vision.transforms:常用的图像操作,例如:随机切割,旋转,数据类型转换,图像到tensor ,numpy 数组到tensor , tensor到图像等

(4)vision.utils、 vision.io、vision.ops

2.2.8优化器

(1)GD、BGD、SGD、MBGD

引入了随机性和噪声

(2)Momentum、NAG等

加入动量原则,具有加速梯度下降的作用

(3)AdaGrad,RMSProp,Adam、AdaDelta

自适应学习率

2.2.9添加正则化

(1)L1正则:参数绝对值的和

(2)L2正则:参数的平方和(Pytorch自带,weight_decay)

optimizer =torch.optim.SGD(model.parameters(),Ir=0.01,weight_decay=0.001)

你可能感兴趣的:(pytorch,深度学习,人工智能)