函数 | 功能 | 函数 | 功能 |
---|---|---|---|
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的随机序列 |
运算符 | 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) |
运算符 | 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,5]和 [5,1] 则结果形状为【2,3,5,5】
[2,3,1,5]和[5,2]不可进行广播运算
函数 | 功能 |
---|---|
torch.floor() | 向下取整(不大于数的最大值) |
torch.ceil() | 向上取整(大于数的最小整数) |
torch.roundn() | 四舍五入取整 |
torch.trunc() | 裁剪,只取整数部分 |
torch.frac() | 裁剪,只取小数部分 |
% | 取余 |
函数 | 功能 |
---|---|
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张量
函数 | 功能 |
---|---|
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个最小值及其索引 |
函数 | 名称 | 函数 | 名称 |
---|---|---|---|
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) | 正弦 |
函数 | |
---|---|
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() |
函数 | 功能 |
---|---|
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() | 返回每个值的频数 |
torch.manual_seed()
函数 | 功能 |
---|---|
torch.dist(input,other,p=2) | 计算P范数,主要用来衡量两个矩阵的相似性 |
torch.norm(a,p=2) | 计算范数 |
PCA:将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征
PCA算法的优化目标就是:
(1)降维后同一纬度的方差最大
(2)不同维度之间的相关性为0
(3)协方差矩阵
优化目标:
(1)同类间距尽可能小
(2)不同类间距尽可能大
目标函数:
Font metrics not found for font: .
类间距/类内距,求目标函数的最大值
pytorch实现
pytorch.svd()
a.clamp(2,10)限制范围
函数 | 功能 |
---|---|
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元素的坐标 |
函数 | 功能 |
---|---|
torch.cat(eq, dim=O, out=None) | 按照已经存在的维度进行拼接 |
torch.stack(seq, dim=0, out=None) | 按照新的维度进行拼接 |
torch.gather(input, dim, index, out=None) | 在指定维度上按照索引赋值输出tensor |
函数 | 功能 |
---|---|
torch.chunk(tensor, chunks, dim=O) | 按照某个维度平均分块(最后一个可能小于平均值) |
torch.split(tensor, split_size_or_sections, dim=0) | 按照某个维度依照第二个参数给出的list或者int进行分割tensor |
函数 | 功能 |
---|---|
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) | 指定维度和旋转次数进行张量旋转 |
torch.full(10,size):定义全为10的矩阵
函数 | 功能 |
---|---|
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,…) | 快速傅里叶反变换 |
函数 | 功能 |
---|---|
torch.saves(state, dir) | 保存/序列化 |
torch.load(dir) | 加载模型 |
函数 | 功能 |
---|---|
torch.get_num_threads() | 获得用于并行化CPU操作的OpenMP线程数 |
torch.set_num_threads(int) | 设定用于并行化CPU操作的OpenMP线程数 |
python在默认情况下只使用一个GPU,在多个GPU的情况下就需要使用pytorch提供的DataParallelb
单机多卡
多机多卡
用方法to()可以将Tensor在CPU和GPU(需要硬件支持)之间相互移动
函数 | 功能 |
---|---|
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的打印参数 |
函数 | 功能 |
---|---|
torch.from_numpy(ndarry) | 将numpy转化成Tensor |
a.numpy() | 将Tensor转化成numpy |
目前Variable已经与Tensor合并。
每个tensor通过requires_grad来设置是否计算梯度。
用来冻结某些层的参数
grad:该Tensor的梯度值,每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加。
grad_fn:叶子节点通常为None,只有结果节点的grad_tn才有效,用于指示梯度函数是哪种类型。
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,这可以方便计算高阶微分。
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。
torch.autograd.enable_grad:启动梯度计算的上下文管理器
torch.autograd.no_grad :禁止梯度计算的上下文管理器
torch.autograd.set grad_enabled(mode):设置是否进行梯度计算的上下文管理器
每一个原始的自动求导运算实际上是两个在Tensor上运行的函数
forward函数计算从输入Tensors获得的输出Tensors
backward函数接收输出Tensors对于某个标量值的梯度,并且计算输入Tensors相对于该相同标量值的梯度
最后,利用apply方法执行相应的运算
定义在Function类的父类_FunctionBase中定义的一个方法
定义可训练参数
self.my_param = nn.Parameter(torch.randn(1))self.register_parameter
nn.ParameterList & nn.ParameterDict 通过列表和字典定义参数
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]))
(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
用于定义神经网络的序列,也可以通过字典来定义序列
它是一个抽象概念,既可以表示神经网络中的某个层(layer),也可以表示一个包含很多层的神经网络
model.parameters()可训练参数
model.buffers()不可训练参数
model.state_dict()访问网络结构中的所有参数
model.modules()
forward(), to()
https://pytorch.org/docs/stable/nn.htmI#torch.nn.Module
torchvision主要包括一下几个包:
(1)vision.datasets:几个常用视觉数据集,可以下载和加载
(2)vision.models:已经训练好的模型,例如: AlexNet, VGG,ResNet
(3)vision.transforms:常用的图像操作,例如:随机切割,旋转,数据类型转换,图像到tensor ,numpy 数组到tensor , tensor到图像等
(4)vision.utils、 vision.io、vision.ops
(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)