知识点
矩阵分解
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