损失函数,代价函数,梯度,优化器,学习率,学习率调度器

这些是机器学习中的概念。把这些概念迁移到CV领域要进行一定的抽象。

首先损失,损失是一组参数拟合出来的样本的预测值和样本的真实值之间的差异,损失是用来度量这种差异的,根据不同的拟合权重参数全局有一个对应的损失值,损失后续经过反向传播计算每个参数对应的梯度,找出一个梯度下降最快的方向,用不同的学习率作为优化步长和不同策略的优化器进行优化,所以如何来计算损失对于模型最后的优化效果非常重要。对于梯度,梯度方向,梯度方向是模型代价函数下降最快的方向,代价函数是 损失-权重参数 的一个函数关系,根据参数的不同,可以是一个任意的曲线,可以是一个任意的曲面,更多参数就是无法可视化的高维复杂的函数,整体概念是差不多的。学习率是参数一次更新的步长,学习率调度器是根据一些指标进行学习率的改变,改变优化器优化的步长。优化器的选择也是一个问题,从之前的BGD,到SGD,MBGD,AdaGrad,RMSProp,AdaDelta,Adam,Monmentum等,有全局最优,局部最优的问题,还有震荡的问题。pytorch也提供了六种学习率调度策略,分别是等间隔法,给定间隔法,指数衰减法,余弦下降法,监控指标调整法,LambdaLR自定义调整策略。(有序调整,自适应调整,自定义调整),微调模型设置较小的学习率,从0训练设置较大的学习率。

学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。

正则化,减小方差的策略。解决过拟合问题,过拟合就是说在训练集上方差很小,基本完全拟合,但是在验证集上方差很大,正则化就是降低这个方差,也就是解决模型的过拟合问题。

以上训练过程都是尽量的降低损失,但是在训练集上损失降的过低,会产生过拟合问题,模型泛化能力降低。所以要考虑的是不同权重的参数组合造成的损失等高线和L1正则项都要最小,

随着海量数据处理的兴起,工程上对于模型稀疏化的要求也随之出现了。这时候,L2正则化已经不能满足需求,因为它只是使得模型的参数值趋近于0,而不是等于0,这样就无法丢掉模型里的任何一个特征,因此无法做到稀疏化。这时,L1的作用随之显现。L1正则化的作用是使得大部分模型参数的值等于0,这样一来,当模型训练好后,这些权值等于0的特征可以省去,从而达到稀疏化的目的,也节省了存储的空间,因为在计算时,值为0的特征都可以不用存储了。

L1在确实需要稀疏化模型的场景下,才能发挥很好的作用并且效果远胜于L2。在模型特征个数远大于训练样本数的情况下,如果我们事先知道模型的特征中只有少量相关特征(即参数值不为0),并且相关特征的个数少于训练样本数,那么L1的效果远好于L2。然而,需要注意的是,当相关特征数远大于训练样本数时,无论是L1还是L2,都无法取得很好的效果。

L1正则化:得到满足上面情况的解发生在坐标轴上,特点是 0参数,产生稀疏项,

L2正则化:又称weight decay(权值衰减),知道带上权值衰减就是L2正则化就行了,是定义在优化器里的一个参数,weight_decay就是找一个平衡,不至于过度追求损失的降低。让权值参数不断减小。防止过拟合现象。

optim_normal = torch.optim.SGD(net_normal.parameters(), lr=lr_init, momentum=0.9)
optim_wdecay = torch.optim.SGD(net_weight_decay.parameters(), lr=lr_init, momentum=0.9, weight_decay=1e-2)

动量:用势能来理解。避免模型陷入局部最优点。

学习率调度方法:

等间隔

 from torch.optim.lr_scheduler import StepLRscheduler = StepLR(optimizer, step_size = 4, # Period of learning rate decaygamma = 0.5) # Multiplicative factor of learning rate decay

 给定间隔

 from torch.optim.lr_scheduler import MultiStepLRscheduler = MultiStepLR(optimizer, milestones=[8, 24, 28], # List of epoch indicesgamma =0.5) # Multiplicative factor of learning rate decay

 指数衰减

 rom torch.optim.lr_scheduler import ExponentialLRscheduler = ExponentialLR(optimizer, gamma = 0.5) # Multiplicative factor of learning rate decay.

 余弦调度

 from torch.optim.lr_scheduler import CosineAnnealingLRscheduler = CosineAnnealingLR(optimizer,T_max = 32, # Maximum number of iterations.eta_min = 1e-4) # Minimum learning rate.

 监控指标调度ReduceLROnPlateauLR

        注意这个调度器的参数,mode是指根据监测指标不下降(如损失)就进行学习率调度或不增大(如准确率)就调度。要注意的是,一般学习率一个epoch调整一次,调整时候实例化的调度器

scheduler.step(loss_value) 的step()调度方法里要传入监测的指标。  

ReduceLROnPlateauLR的参数,facyor:调整系数,patience:接受几次不变化,cooldown:冷却时间,停止监控一段时间,verbose:是否打印日志,min_lr:学习率下限,eps:学习率衰减最小值。

import torch
from torch import nn, optim
from torch.optim.lr_scheduler import ReduceLROnPlateaupython复制代码# 创建模型实例
model = Net()# 定义损失函数
criterion = nn.MSELoss()# 定义优化器和学习率
optimizer = optim.SGD(model.parameters(), lr=0.01)# 定义学习率调度器
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5)

自定义调整策略

import torch
import matplotlib.pyplot as pltepoches = 100
learning_rate = 0.1
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
model = [torch.nn.Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = torch.optim.SGD(model, learning_rate)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer=optimizer, lr_lambda=[lambda1])
e = [i for i in range(epoches)]
lrs = []
for epoch in range(100):optimizer.step()scheduler.step()lrs.append(scheduler.get_last_lr())plt.plot(e, lrs)
plt.show()

 

 
import torch
import torch.utils.data as Data
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt# 超参数
LR = 0.01
BATCH_SIZE = 32
EPOCH = 12# 生成假数据
# torch.unsqueeze() 的作用是将一维变二维,torch只能处理二维的数据
x = torch.unsqueeze(torch.linspace(-1, 1, 1000), dim=1)  # x data (tensor), shape(100, 1)
# 0.2 * torch.rand(x.size())增加噪点
y = x.pow(2) + 0.1 * torch.normal(torch.zeros(*x.size()))# 定义数据库
dataset = Data.TensorDataset(x, y)# 定义数据加载器
loader = Data.DataLoader(dataset=dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=0)# 定义pytorch网络
class Net(torch.nn.Module):def __init__(self, n_features, n_hidden, n_output):super(Net, self).__init__()self.hidden = torch.nn.Linear(n_features, n_hidden)self.predict = torch.nn.Linear(n_hidden, n_output)def forward(self, x):x = F.relu(self.hidden(x))y = self.predict(x)return y# 定义不同的优化器网络
net_SGD = Net(1, 10, 1)
net_Momentum = Net(1, 10, 1)
net_Adagrad = Net(1, 10, 1)
net_Adadelta = Net(1, 10, 1)
net_RMSprop = Net(1, 10, 1)
net_Adam = Net(1, 10, 1)
net_Adamax = Net(1, 10, 1)
net_AdamW = Net(1, 10, 1)
net_LBFGS = Net(1, 10, 1)# 选择不同的优化方法
opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.9)
opt_Adagrad = torch.optim.Adagrad(net_Adagrad.parameters(), lr=LR)
opt_Adadelta = torch.optim.Adadelta(net_Adadelta.parameters(), lr=LR)
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)
opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))
opt_Adamax = torch.optim.Adamax(net_Adamax.parameters(), lr=LR, betas=(0.9, 0.99))
opt_AdamW = torch.optim.AdamW(net_AdamW.parameters(), lr=LR, betas=(0.9, 0.99))
opt_LBFGS = torch.optim.LBFGS(net_LBFGS.parameters(), lr=LR, max_iter=10, max_eval=10)nets = [net_SGD, net_Momentum, net_Adagrad, net_Adadelta, net_RMSprop, net_Adam, net_Adamax, net_AdamW, net_LBFGS]
optimizers = [opt_SGD, opt_Momentum, opt_Adagrad, opt_Adadelta, opt_RMSprop, opt_Adam, opt_Adamax, opt_AdamW, opt_LBFGS]# 选择损失函数
loss_func = torch.nn.MSELoss()# 不同方法的loss
loss_SGD = []
loss_Momentum = []
loss_Adagrad = []
loss_Adadelta = []
loss_RMSprop = []
loss_Adam = []
loss_Adamax = []
loss_AdamW = []
loss_LBFGS = []# 保存所有loss
losses = [loss_SGD, loss_Momentum, loss_Adagrad, loss_Adadelta, loss_RMSprop, loss_Adam, loss_Adamax, loss_AdamW, loss_LBFGS]# 执行训练
for epoch in range(EPOCH):for step, (batch_x, batch_y) in enumerate(loader):var_x = Variable(batch_x)var_y = Variable(batch_y)for net, optimizer, loss_history in zip(nets, optimizers, losses):if isinstance(optimizer, torch.optim.LBFGS):def closure():y_pred = net(var_x)loss = loss_func(y_pred, var_y)optimizer.zero_grad()loss.backward()return lossloss = optimizer.step(closure)else:# 对x进行预测prediction = net(var_x)# 计算损失loss = loss_func(prediction, var_y)# 每次迭代清空上一次的梯度optimizer.zero_grad()# 反向传播loss.backward()# 更新梯度optimizer.step()# 保存loss记录loss_history.append(loss.data)# 画图
labels = ['SGD', 'Momentum', 'Adagrad', 'Adadelta', 'RMSprop', 'Adam', 'Adamax', 'AdamW', 'LBFGS']
for i, loss_history in enumerate(losses):plt.plot(loss_history, label=labels[i])
plt.legend(loc='best')
plt.xlabel('Steps')
plt.ylabel('Loss')
plt.ylim((0, 0.2))
plt.show()

参考博客:https://blog.csdn.net/xian0710830114/article/details/126551268

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机问卷调查数据的处理(uniapp)

需求:问卷调查 1.返回的数据中包含单选、多选、多项文本框、单文本框、图片上传 2.需要对必填的选项进行校验 3.非必填的多项文本框内容 如果不填写 不提交 表单数据格式 res{"code": 0,"msg": null,"data": [{"executeDay&…

二叉搜索树、AVL、红黑树、B树

文章目录 二叉搜索树2. avl树3. 红黑树 b树和b树比较适合与磁盘打交道的,磁盘操作耗时,这些树 矮,红黑树、avL树高,比较适合与内存打交道。 二叉搜索树 找一个节点的前驱和后继: 前驱:如果节点有左子树&a…

两个图片完美融合 泊松编辑

一、效果惊人 二、步骤 下载安装 https://github.com/Trinkle23897/Fast-Poisson-Image-Editing.git 执行 test 目录下的 python data.py下载数据 执行测试,可以看到效果了 $ fpie -s test1_src.jpg -m test1_mask.jpg -t test1_tgt.jpg -o result1.jpg -h1 -…

JNI学习(二)

静态注册 接着上篇博客学习 JNI函数 JNIEXPORT void JNICALL Java_com_example_jnidemo_TextDemo_setText(JNIEnv *env, jobject this, jstring string){ __android_log_print(ANDROID_LOG_ERROR, "test", "invoke set from C\n");char* str (char*)(*e…

基于SpringBoot和spark的共享单车存储管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot和spark的共享单车存储管…

c语言知识点补充

文件: 1.字符串: 1.srrlen()字符串测长函数; 2.strcat()字符串连接函数; 3.strcmp()字符串比较函数; 4.strcpy()字符串拷贝…

【Unity】入门

文章目录 概述常用组件各类文件基础知识创建工程工程目录介绍五个窗口面板创建代码和场景 脚本与编程鼠标的输入键盘的输入代码来操作组件获取物体API资源的使用API定时调用与线程向量的基本运算预制体与实例 物理系统与组件案例实操作快捷键来源 Unity已广泛运用到各个领域&am…

Linux对于软件的管理

软件管理 ​ 在linux操作系统中,关于软件的安装与Windows操作系统上的软件安装以及软件包的管理有很大的不同。在linux中,常常使用apt-get命令进行软件安装。实际上该命令是linux软件包管理(PMS)的一个工具。在实际工程实践以及软…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透,将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav,并且结合cpolar的内网穿透工具实现在公网访…

结构型模式 | 适配器模式

一、适配器模式 1、原理 适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类:类适配器模式、对象适配器模式、接口…

深职大专访:卓翼飞思仿真及实飞平台在氢能无人机控制技术领域的应用

欢迎来到飞思客户访谈栏目《实话实说》,本期我们走进深圳职业技术大学(以下简称“深职大”)对智能科学与工程研究院研究员林鸿博士进行专访,分享深职大- 卓翼氢能无人机控制技术研究中心建设的初衷、卓翼飞思无人机虚拟仿真及实飞…

【ARM Cortex-M 系列 5 -- RT-Thread renesas/ra4m2-eco 移植编译篇】

文章目录 RT-Thread 移植编译篇编译os.environ 使用示例os.putenv使用示例python from 后指定路径 编译问题_POSIX_C_SOURCE 介绍编译结果 RT-Thread 移植编译篇 本文以瑞萨的ra4m2-eco 为例介绍如何下载rt-thread 及编译的设置。 RT-Thread 代码下载: git clone …

T2I-Adapter: 让马良之神笔(扩散模型)从文本生成图像更加可控

文章信息 单位:北大深张健团队,腾讯ARC lab 源码: https://github.com/TencentARC/T2I-Adapter 图1. 插个DXL的渲染图,这么真实的光感,感觉PS都可以被取代了 目录 文章信息前言一、介绍二、相关工作1.图像合成与转换2 扩散模型3 适…

Deployment Controller详解(下)

上一篇在《Deployment Controller详解(上)》中介绍了Deployment Controller 的创建、更新和回滚。了解了这三个功能,基本上也就懂得了大厂PaaS平台中服务的灰度升级、失败回滚等操作是如何实现的了。 接下来本文会介绍Deployment Controller…

Spring MVC 方法中添加参数、HttpServletRequest 和 HttpServletResponse 对象

在这个例子中,我们添加了 HttpServletRequest 和 HttpServletResponse 对象作为控制器方法的参数。这样,你就可以在方法内部同时访问请求参数、请求对象和响应对象,从而进行更灵活的 HTTP 请求和响应处理。 RestController public class MyC…

war exploded: Error during artifact deployment. See server log for details.

今天在用Tomcat时,报错了**[2023-12-23 12:26:43,718] war exploded: Error during artifact deployment. See server log for details.** 原因 自己的注解Servlet没有加/ WebServlet(urlPatterns "ManageServlet01") // 错误的// 正确的 WebServl…

欧几里得算法

文章目录 欧几里得算法介绍欧几里得算法的证明证明1:b和a%b的最大公约数,也是a和b的公约数证明2:b和a%b的最大公约数,也是a和b的最大公约数 欧几里得算法介绍 小学或初中时学过辗转相除法,用于求两个数的最大公约数。…

引领汽车营销新趋势,3DCAT实时云渲染助力汽车三维可视化

当前,汽车产业发展正从电动化的上半场,向智能化的下半场迈进。除了车机技术体验的智能化之外,观车体验的智能化也不容忽视。 这是因为,随着数字化、智能化、个性化的趋势,消费者对汽车的需求和期待也越来越高&#xf…

CSS overflow-anchor

overflow-anchor 为了认识这个属性, 我们需要先看一种常见的现象. 即在网页加载中, 图片常常比文字加载更慢, 这样图片加载完成后可能会将文字向下顶. 比如下图演示 <div class"overflow"><img id"bg" src"" height"150" al…

【NI-RIO入门】使用其他文本语言开发CompactRIO

1.FPGA 接口Python API Getting Started — FPGA Interface Python API 19.0.0 documentation 2.FPGA接口C API FPGA 接口 C API 是用于 NI 可重配置 I/O (RIO) 硬件&#xff08;例如 NI CompactRIO、NI Single-Board RIO、NI 以太网 RIO、NI FlexRIO、NI R 系列多功能 RIO 和…