损失函数
损失函数的输入是一个输入的pair: (output, target), 然后计算出一个数值来评估output和target之间的差距大小.
在torch.nn中有若干不同的损失函数可供使用, 比如nn.MSELoss就是通过计算均方差损失来评估输入和目标值之间的差距
参数更新
--误差反向传播
误差反向传播法是Rumelhart等在1986年提出的,即BP(error BackPropagation)法影响最为广泛,也称BP算法。
--微分连锁律是一门高等数学的定律。连锁律的基本公式为:dy/dx=(dy/dz)×(dz/dx)
微分链式法则中,我们将一个函数分解成多个函数的复合形式,然后对每个函数分别求导,最后将它们相乘得到最终的导数
-- 完成偏微分值的计算后,再乘以学习率,再从参数中减去这一计算结果,就实现了对参数的更新操作
“optimizer.step()是PyTorch中优化器对象的一个方法,用于更新模型的参数
Pytorch--函数功能
导入的package
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
1、 准备数据集 涉及到torch.utils.data.Dataset和DataLoader)
2、 定义网络结构 torch.nn.Module nn.Conv2d
3、定义损失函数 criterion = torch.nn.MSELoss()
4、定义优化算法 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
5、迭代训练
for epoch in range(num_epochs):
# Forward pass 5.2 前向传播计算网络结构的输出结果
outputs = model(inputs)
# 5.3 计算损失函数
loss = criterion(outputs, targets)
# Backward and optimize 5.4 反向传播更新参数
optimizer.zero_grad()
loss.backward()
optimizer.step()
6.保存训练的模型
迭代训练
定义传播进行网络参数更新:
(1)将上一个迭代所计算的梯度进行清零:optimizer.zero_grad()
(2)进行本次迭代的梯度计算:loss.backward()
(3)更新网络的权值参数:optimizer.step()
说明
1.模型中所有的可训练参数, 可以通过net.parameters()来获得.或者(model.parameters()
# 通过optim创建优化器对象
optimizer = optim.SGD(net.parameters(), lr=0.01)
2.Pytorch中执行反向传播非常简便, 全部的操作就是loss.backward().在执行反向传播之前, 要先将梯度清零, 否则梯度会在不同的批次数据之间被累加.
当调用loss.backward()时, 整张计算图将对loss进行自动求导,
所有属性requires_grad=True的Tensors都将参与梯度求导的运算, 并将梯度累加到Tensors中的.grad属性中.
自定义
01.自定义网络结构
# 定义一个网络
class Model(nn.Module):
def __init__(self,class_num,input_channel=3):
def forward(self, x):
02.自定义损失函数-loss函数并没有需要学习的参数-pytorch 自定义损失函数主要有两种方式
方式一编写一个继承nn.Module的Loss函数类,并在forward()方法中实现loss计算
定义初始化方法(init),二是定义前向计算方式(forward)。
自定义损失函数与自定义网络类似。需要继承nn.Module类,然后重写forward方法即可
def forward(self,output,target):
方式二:自定义函数:输入输出的变量都得是torch.tensor类型
编写一个Loss函数类,并在_ call _方法中实现loss计算
eg:
total_loss = class loss + bbox loss+ object loss
损失函数.使用方式
loss_fn = MyLoss() # 实例化Loss函数
loss = loss_fn(preds, targets) # 计算loss值,即预测值与真实值之间的误差
03.优化方法
不同优化方法之间最大的差异在于他们的搜索方向和搜索步长不同
学习率衰减的策略来加速算法收敛。其思想为:先取一个较大的学习率加速收敛,然后随着遍历次数(epoch)的增加逐步减小学习率,防止跳出局部最优解
自定义函数-调整学习率
模型微调
模型微调(finetune
冻结参数-- 通过设置requires_grad = False来冻结部分层
单模态(mono-modality)与多模态(multi-modality)
配准-寻求一种空间变换,使它与另一幅图像上的对应点达到空间上的一致
配对数据的标准多模态学习
Meta日前开源了一种可以将可以横跨6种不同模态的全新AI模型ImageBind,包括文本、音频、视觉数据、温度和运动读数
ImageBind: One Embedding Space To Bind Them All. https://github.com/facebookresearch/ImageBind
ImageBind,Meta Make-A-Scene可以从音频创建图像 ImageBind可以跨多种模态创建联合嵌入空间,而无需使用每种不同模态组合对数据进行训练
https://github.com/facebookresearch/segment-anything
参考
用Pytorch构建神经网络的基本流程和实现过程 https://blog.csdn.net/itcast_cn/article/details/127284590
https://github.com/NielsRogge