Skip to main content

知识点

矩阵分解

LU分解 : 将矩阵A分解城L(下三角)矩阵和U(上三角)矩阵的乘积 QR分解 : 将原矩阵分解成一个正交矩阵Q和一个上三角矩阵R的乘积 EVD : 特征值分解 -> PCA 特征降维 SVD : 奇异值分解 -> LDA 判别分析 tensor.svd() 特征值分解: 将矩阵分解为由其特征值特征向量表示的矩阵之积的方法

裁剪运算

梯度裁剪 梯度离散 梯度爆炸 a.clamp(2,10) 会将小于2的设为2 大于10的设为10

索引与数据筛选

  • torch.where(condition,x,y): 按照条件从x和y中选出满足条件的元素组成新的tensor
  • torch.gather(input,dim,index,out=None):在指定维度上按照索引赋值输出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(seq,dim=0,out=None): 按照已经存在的维度进行拼接
  • torch.stack(seq,dim=0,out=None): 按照新的维度进行拼接
  • torch.gather(seq,dim=0,out=None): 在指定维度上按照索引赋值输出tensor

Tensor的切片

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

Tensor的变形操作

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

填充

torch.full( (2,3),3.14 )

频谱操作

torch.fft();torch.ifft();torch.rfft();torch.irfft();torch.stft();

模型的保存/加载

  • torch.saves(state,dir) 保存/序列化
  • torch.load(dir) 加载模型

并行化

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

Tensor的相关配置

  • torch.device("cude") 用方法to() 将Tensor在CPU和GPU之间相互移动
  • torch.is_tensor() : 如果是pythorch的tensor类似返回True
  • torch.is_storage() : 如果是pythorch的storage类似返回True
  • torch.set_flush_denormal(mode): 防止一些不正常的元素产生
  • torch.set_default_dtype(d): 对torch.tensor() 设置默认的浮点类型
  • torch.set_printoptions(procision=None,threshold=None,edgeitems=None,linewidth=None,profile=None) 设置printing的打印参数

Tensor与numpy的相互转换

  • torch.from_numpy(ndarry) numpy 转 tensor
  • a.numpy() tensor 转 Numpy

梯度 variable Autograd

  • 每个tensor通过requires_grad来设置是否计算梯度
  • grad:该Tensor的梯度值,每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加.
  • grad_fn: 叶子节点通常为None, 只有结果节点的grad_fn才有效,用于指示梯度函数是哪种类型.
  • 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 the derivative,这可以方便计算高阶微分.
  • torch.autograd.grad(outputs,inputs,grad_tensors=None,retain_graph=None,create_graph=False,only_inputs=true,allow_unused=false) :计算和返回output关于inputs的梯度的和.
    • outputs: 函数的因变量,即需要求导的那个函数
    • inputs: 函数的自变量
    • only_inputs: 只计算input的梯度
    • allow_unused(bool,可选): 如果为False,当计算输出出错时(因此他们的梯度永远是0)指明不使用的inputs.
  • torch.autograd.enable_grad : 启动梯度计算的上下文管理器
  • torch.autograd.no_grad : 禁止梯度计算的上下文管理器
  • torch.autograd.set_grad_enable(mode) : 设置是否进行梯度计算的上下文管理器.
  • torch.autograd.Function

torch.nn 库

nn.Parameter 定义可训练的参数 nn.ParameterList nn.ParameterDict nn.Linear nn.Conv2d nn.ReLU nn.MaxPool2d nn.MSELoss nn.functional nn.Sequential nn.Module 表示神经网络中的某个层,也可表示一个包含很多层的神经网络 nn.ModuleList nn.ModuleDict torch.save(obj=model.state_dict(),f="models/net.pth") model.load_state_dict(torch.load("models/net.pth"))

  • 一种是反向传播需要被optimizer更新的称之为parameter
    • self.register_parameter("param",param)
    • self.param=nn.Parameter(torch.randn(1))
  • 一种是反向传播不需要被optimizer更新,称之为buffer
    • self.register_buffer('my_buffer',torch.randn(1))

调试工具

  • visdom 可视化 安装 pip install visdom 启动服务 python -m visdom.server
  • tensorboardX 安装 pip3 isntall tensorboardX 打开日志文件 tensorboard --logdir ./
  • torchvision
    • vision.datasets: 常用的视觉数据集
    • vision.models: 已经训练好的模型
    • vision.transforms: 常用的图像操作
    • vision.utils, vision.io, vision.ops