文章目录
- 张量
- 预处理数据和预加载数据集的工具包
- 神经网络模块
- 保存和加载模型
- 数据计算
- 其他Tips
- 待整理
- transforms模块[参考](https://blog.csdn.net/qq_36825778/article/details/104088528?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163533622716780261932098%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163533622716780261932098&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-104088528.first_rank_v2_pc_rank_v29&utm_term=+tarnsforms+compose&spm=1018.2226.3001.4187)
- torchVision
张量
- 张量类似于NumPy 的ndarray,不同之处在于张量可以在 GPU 或其他硬件加速器上运行
方法 | 作用 | |
---|---|---|
torch.cat | 连接两个相同shape的tensor | |
tensor1@tensor2 | 矩阵乘法 | |
tensor1.matmul(tensor2) | 矩阵乘法 | |
torch.matmul(tensor1, tensor2, out=tensor3) | 矩阵乘法 | |
tensor1*tensor2 | 对应位置的值直接相乘 | |
tensor1.mul(tensor2) | 对应位置的值直接相乘 | |
torch.mul(tensor1, tensor2, out=tensor3) | 对应位置的值直接相乘 | |
.item() | 将张量数类型转为python(限单个数) | |
+、-、*、/、** | 对应位置的值直接相乘 | |
.add_() | 就地操作 | |
numpy_array= tensor.numpy() | 如果tensor改变,将改变numpy_array的值,反之不成立。尽管他们的对象类型不一样 | |
tensor=torch.from_numpy(numpy_array) | 如果numpy_array改变,将改变tensor的值,反之不成立。尽管他们的对象类型不一样 |
注:tensor指的是具体的张量,
预处理数据和预加载数据集的工具包
torch.utils.data.DataLoader
torch.utils.data.Dataset
神经网络模块
方法 | 含义 | 参数 |
---|---|---|
nn.Linear | 全连接层 | |
nn.ReLU | 激活函数 | |
nn.Flatten | ||
nn.Sequntial | 有序的模块容器。数据按照定义的相同顺序通过所有模块。 | |
nn.Softmax | ||
model.named_parameters() | 自动跟踪模型对象中定义的所有字段 |
常见损失函数
方法 | 含义 | 参数 | 主要用途 |
---|---|---|---|
nn.MSELoss | 均方误差 | 回归 | |
nn.NLLLoss | 负对数似然函数 | 分类 | |
nn.CrossEntroyLoss | 交叉熵损失函数 | ||
nn.LogSoftmax | |||
F.binary_cross_entropy_with_logits | |||
常见优化器
每个训练步骤中调整模型参数以减少模型误差的过程
torch.optim.+ 方法名 | 中文名 | 参数 |
---|---|---|
ADAM | ||
SGD | 随机梯度下降 | model.parameters(), lr |
RMSProp | ||
该对象的方法
- zero_grad(): 重置模型参数的梯度
- step(): 在向后传递中收集的梯度来调整参数
神经网络术语
epoch | 训练循环- 迭代训练数据集并尝试收敛到最佳参数。 验证/测试循环- 迭代测试数据集以检查模型性能是否正在提高 | |
learning_rate | 在每个批次/时期更新模型参数的程度。 | |
batch_size | 在更新参数之前通过网络传播的数据样本数量 | |
loss | 损失函数 | |
Optimizer | 优化器 |
保存和加载模型
1. 保存和加载模型权重
一定要model.eval()
在推理之前调用方法以将 dropout 和批量归一化层设置为评估模式。不这样做会产生不一致的推理结果
-
加载模型
model.load_state_dict(torch.load('model_weights.pth')) model.eval()
-
保存模型
torch.save(model.state_dict(), 'model_weights.pth')
2. 保存和加载模型类和权重
-
加载
torch.load(model, path)
-
保存
model.save(model, path)
数据计算
方法 | ||
---|---|---|
torch.exp() | ||
tensor.sum() | ||
a+b | 广播机制 | |
tensor.numel() | ||
torch.exp() | ||
双线性插值
torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)
nn.Upsample
其他Tips
-
张量在给出其他部分后可以自动计算出一个维度。我们可以通过在希望张量自动推断的维度放置
-1
来调用此功能。在上面的例子中,我们可以用x.reshape(-1,4)
或x.reshape(3,-1)
来取代 -
对于文本,可以直接用 Python 或 Cython 基础数据加载模块,或者用 NLTK 和 SpaCy
待整理
-
张量在给出其他部分后可以自动计算出一个维度。我们可以通过在希望张量自动推断的维度放置
-1
来调用此功能tensor.reshape(-1, 2)
-
torch.zeros((2, 3, 4))
-
torch.randn
-
torch.arange tensor.item() tensor.clone() tensor.numel() 元素总数 tensor.mean() tensor.sum(axis=1, keepdims=True) 不降维进行求和 torch.dot() 矩阵点积 torch.mv(A, x) 矩阵向量积 torch.mm() \ @ 矩阵乘法 (matrix) torch.norm(u) 范数 torch.detach() 返回一个新的tensor,从当前计算图中分离下来。但是仍指向原变量的存放位置,不同之处只是requirse_grad为false.得到的这个tensir永远不需要计算器梯度,不具有grad.
即使之后重新将它的requires_grad置为true,它也不会具有梯度grad.这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播.
注意:
使用detach返回的tensor和原始的tensor共同一个内存,即一个修改另一个也会跟着改变tensor[tensor] 一个张量的索引可以是另一个张量
transforms模块参考
-
Compose
将多个
transform
组合起来使用。 -
CenterCrop(size)
将给定的
PIL.Image
进行中心切割,得到给定的size
,size
可以是tuple
,(target_height, target_width)
。size
也可以是一个Integer
,在这种情况下,切出来的图片的形状是正方形。 -
Normalize介绍
Normalize()函数的作用是将数据转换为标准高斯分布,即逐个channel的对图像进行标准化(默认均值变为0 ,标准差为1),可以加快模型的收敛。
经常看到的mean = [ 0.485 , 0.456 , 0.406 ], std = [ 0.229 , 0.224 , 0.225 ] 表示的是从数据集中随机抽样计算得到的。
-
np.transpose(npimg, (1, 2, 0)) 表示将图像的0-> 1轴交换,1->2轴交换, 2->0轴交换
torchVision
- utils.make_grid make_grid的作用是将若干幅图像拼成一幅图像。其中padding的作用就是子图像与子图像之间的pad有多宽。见
Viriable
- 与tensor的区别
viriable可以求梯度,tensor不能求梯度
训练
-
将tensor 通过cuda加载到GPU\CPU中计算
tensor.cuda() tensor.cpu()
-
将网络迁移到GPU
torch.device() net.to(device)
坑
-
1.0版本
dataloader不是一个可迭代对象,需要iter()
torch.utils.data.DataLoader
迁移学习
实际中,基本没有人会从零开始(随机初始化)训练一个完整的卷积网络,因为相对于网络,很难得到一个足够大的数据集[网络很深, 需要足够大数据集]。通常的做法是在一个很大的数据集上进行预训练得到卷积网络ConvNet, 然后将这个ConvNet的参数作为目标任务的初始化参数或者固定这些参数。
常见操作 transform
自定义卷积核进行卷积
c.weight.data = torch.Tensor([[[[1, 1, 1],
[1, 1, 0],
[0, 1, 1]]]]