APIs
[TOC]
Tensor
pytorch
1 | #1 list->tensor |
libtorch(c++)
1 | //1 数组 -> Tensor |
张量操作
pytorch
1 | # index + slice |
libtorch(c++)
1 | // index |
3、 提取指定元素形成新的张量(关键字index:就代表是提取出来相应的元素组成新的张量)
1 | std::cout<<b.index_select(0,torch::tensor({0, 3, 3})).sizes();//选择第0维的0,3,3组成新张量[3,3,28,28] |
张量基本运算
3.1 pytorch
① 按元素的加减乘除正常使用±*/的运算符即可
② 矩阵乘法:例如xx^T
1 | x = torch.rand((3,4)) |
3.2 torchlib
① 按元素的加减乘除正常使用±*/的运算符即可
② 矩阵乘法:例如xx^T
1 | auto x = torch::rand({3,4}); |
Init Weight
1 | torch.nn.init.xavier_uniform_(conv.weight) |
API-tensor
torch — PyTorch 2.0 documentation
torch.reshape()
torch.reshape用来改变tensor的shape。
torch.reshape(tensor,shape)
tensor.squeeze()
维度压缩
如果 input 的形状为 (A×1×B×C×1×D),那么返回的tensor的形状则为 (A×B×C×D)
1 | 2, 1, 2, 1, 2) x = torch.zeros( |
tensor.unsqueenze()
1 | 1, 2, 3, 4]) x = torch.tensor([ |
torch.gather函数
(todo)
图解PyTorch中的 []https://zhuanlan.zhihu.com/p/352877584
torch.flatten()
扁平化
torch.flatten(t, start_dim=0, end_dim=-1) 的实现原理如下。假设类型为 torch.tensor 的张量 t 的形状如下所示:(2,4,3,5,6),则 torch.flatten(t, 1, 3).shape 的结果为 (2, 60, 6)。将索引为 start_dim 和 end_dim 之间(包括该位置)的数量相乘【1,2,3维度的数据扁平化处理合成一个维度】,其余位置不变。因为默认 start_dim=0,end_dim=-1,所以 torch.flatten(t) 返回只有一维的数据。
mean()
求均值
var()
求方差
item()
.item()用于在只包含一个元素的[tensor](https://so.csdn.net/so/search?q=tensor&spm=1001.2101.3001.7020)中提取值,注意是只包含一个元素,否则的话使用.tolist()
tolist()
tensor转换为Python List
permute
作用类似tf的transpose()
mask
pytorch提供mask机制用来提取数据中“感兴趣”的部分。过程如下:左边的矩阵是原数据,中间的mask是遮罩矩阵,标记为1的表明对这个位置的数据“感兴趣”-保留,反之舍弃。整个过程可以视作是在原数据上盖了一层mask,只有感兴趣的部分(值为1)显露出来,而其他部分则背遮住。
torch.masked_fill(input, mask, value)
参数:
- input:输入的原数据
- mask:遮罩矩阵
- value:被“遮住的”部分填充的数据,可以取0、1等值,数据类型不限,int、float均可
返回值:一个和input相同size的masked-tensor
使用:
- output = torch.masked_fill(input, mask, value)
- output = input.masked_fill(mask, value)
torch.masked_select(input, mask, out)
参数:
- input:输入的原数据
- mask:遮罩矩阵
- out:输出的结果,和原tensor不共用内存,一般在左侧接收,而不在形参中赋值
返回值:一维tensor,数据为“选中”的数据
使用:
- torch.masked_select(input, mask, out)
- output = input.masked_select(mask)
1 | selected_ele = torch.masked_select(input=imgs, mask=mask) # true表示selected,false则未选中,所以这里没有取反 |
torch.masked_scatter(input, mask, source)
说明:将从input中mask得到的数据赋值到source-tensor中
参数:
- input:输入的原数据
- mask:遮罩矩阵
- source:遮罩矩阵的”样子“(全零还是全一或是其他),true表示遮住了
返回值:一个和source相同size的masked-tensor
使用:
- output = torch.masked_scatter(input, mask, source)
- output = input.masked_scatter(mask, source)
API-Model
train(mode=True)
将module
设置为 training mode
。
仅仅当模型中有Dropout
和BatchNorm
是才会有影响。
eval()
将模型设置成evaluation
模式
仅仅当模型中有Dropout
和BatchNorm
是才会有影响。
训练
BN使用注意事项
model.eval()之后,pytorch会管理BN的参数,所以不需要TF那般麻烦;
$$
Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta
$$
其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。
所以在训练阶段,running_mean和running_var在每次前向时更新一次;
在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。
torchrun
torchrun (Elastic Launch) — PyTorch 2.3 documentation
关于集群分布式torchrun命令踩坑记录(自用)-CSDN博客
Model Save & Load
save model
1 | torch.save({ |
save state_dict()
1 | torch.save(learner_model.get_model(position).state_dict(), model_weights_dir) |
Saving & Loading Model
Save:
1 | torch.save(model.state_dict(), PATH) |
Load:
1 | model = TheModelClass(*args, **kwargs) |
Save/Load Entire Model
Save:
1 | torch.save(model, PATH) |
Load:
1 | # Model class must be defined somewhere |
Export/Load Model in TorchScript Format
Export:
1 | model_scripted = torch.jit.script(model) # Export to TorchScript |
Load:
1 | model = torch.jit.load('model_scripted.pt') |
Saving & Loading a General Checkpoint for Inference and/or Resuming Training
Save:
1 | torch.save({ |
Load:
1 | model = TheModelClass(*args, **kwargs) |
Saving Multiple Models in One File
Save:
1 | torch.save({ |
Load:
1 | modelA = TheModelAClass(*args, **kwargs) |
Warmstarting Model Using Parameters from a Different Model
Saving & Loading Model Across Devices
Save:
1 | torch.save(modelA.state_dict(), PATH) |
Load:
1 | modelB = TheModelBClass(*args, **kwargs) |
Save on GPU, Load on CPU
Save:
1 | torch.save(model.state_dict(), PATH) |
Load:
1 | device = torch.device('cpu') |
Save on GPU, Load on GPU
Save:
1 | torch.save(model.state_dict(), PATH) |
Load:
1 | device = torch.device("cuda") |
Save on CPU, Load on GPU
Save:
1 | torch.save(model.state_dict(), PATH) |
Load:
1 | device = torch.device("cuda") |
Saving torch.nn.DataParallel
Models
Save:
1 | torch.save(model.module.state_dict(), PATH) |
Load:
1 | # Load to whatever device you want |
模型参数(打印print)
1 | import torch |
此我们可以使用clone()方法来创建它们的副本。具体来说,我们可以使用clone()方法来创建一个张量的深拷贝,然后使用detach()方法来将其从计算图中分离,从而得到一个不会影响原始张量的新张量。
1 | # 打印模型的所有参数名和参数值,并取出参数值 |