- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
文本框检测的Cosine学习率调度器:
13种调度器
学习率 0.001 效果好像比较好,推荐使用
configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml
摘取部分节点:
Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
lr:
name: Cosine
learning_rate: 0.01
warmup_epoch: 2
train.py调用:
optimizer, lr_scheduler = build_optimizer(
config['Optimizer'],
epochs=config['Global']['epoch_num'],
step_each_epoch=len(train_dataloader),
parameters=model.parameters())
余弦退货学习率代码:
先用CosineAnnealingDecay 衰减,再用LinearWarmup线性恢复学习率
class Cosine(object):
"""
Cosine learning rate decay
lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)
Args:
lr(float): initial learning rate
step_each_epoch(int): steps each epoch
epochs(int): total training epochs
last_epoch (int, optional): The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
"""
def __init__(self,
learning_rate,
step_each_epoch,
epochs,
warmup_epoch=0,
last_epoch=-1,
**kwargs):
super(Cosine, self).__init__()
self.learning_rate = learning_rate
self.T_max = step_each_epoch * epochs
self.last_epoch = last_epoch
self.warmup_epoch = round(warmup_epoch * step_each_epoch)
def __call__(self):
learning_rate = lr.CosineAnnealingDecay(
learning_rate=self.learning_rate,
T_max=self.T_max,
last_epoch=self.last_epoch)
if self.warmup_epoch > 0:
learning_rate = lr.LinearWarmup(
learning_rate=learning_rate,
warmup_steps=self.warmup_epoch,
start_lr=0.0,
end_lr=self.learning_rate,
last_epoch=self.last_epoch)
return learning_rate
目前在paddle中基于该基类,已经实现了12种策略,分别为:CosineAnnealingDecay, ExponentialDecay, InverseTimeDecay, LambdaDecay, LinearWarmup, MultiStepDecay, NaturalExpDecay, NoamDecay, PiecewiseDecay, PolynomialDecay, ReduceOnPlateau, StepDecay。除此之外,博主根据网上的代码整理出了OneCycleLR。基于此,博主对13种学习率调度器的进行了可视化绘图
1、13种调度器的可视化绘图
NoamDecay: 诺姆衰减,相关算法请参考 《Attention Is All You Need》 。请参考 NoamDecay
ExponentialDecay: 指数衰减,即每次将当前学习率乘以给定的衰减率得到下一个学习率。请参考 ExponentialDecay
NaturalExpDecay: 自然指数衰减,即每次将当前学习率乘以给定的衰减率的自然指数得到下一个学习率。请参考 NaturalExpDecay
InverseTimeDecay: 逆时间衰减,即得到的学习率与当前衰减次数成反比。请参考 InverseTimeDecay
PolynomialDecay: 多项式衰减,即得到的学习率为初始学习率和给定最终学习之间由多项式计算权重定比分点的插值。请参考 cn_api_paddle_optimizer_lr_PolynomialDecay。
PiecewiseDecay: 分段衰减,即由给定step数分段呈阶梯状衰减,每段内学习率相同。请参考 PiecewiseDecay
CosineAnnealingDecay: 余弦式衰减,即学习率随step数变化呈余弦函数周期变化。请参考 CosineAnnealingDecay
LinearWarmup: 学习率随step数线性增加到指定学习率。请参考 LinearWarmup
StepDecay: 学习率每隔固定间隔的step数进行衰减,需要指定step的间隔数。请参考 StepDecay
MultiStepDecay: 学习率在特定的step数时进行衰减,需要指定衰减时的节点位置。请参考 MultiStepDecay
LambdaDecay: 学习率根据自定义的lambda函数进行衰减。请参考 LambdaDecay
ReduceOnPlateau: 学习率根据当前监控指标(一般为loss)来进行自适应调整,当loss趋于稳定时衰减学习率。请参考 ReduceOnPlateau
OneCysleLR:学习率先上升,达到最大值后再下降
2、绘图代码及OneCysleLR的实现
通过继承paddle.optimizer.lr import LRScheduler , 重写该基类的 get_lr() 函数,实现自定义调度器。博主基于网上的公开代码进行调整,实现了OneCysleLR,并整理出代码对这13种学习率调度器曲线进行绘图。
%matplotlib inline
import paddle
import paddle.nn as nn
import matplotlib.pyplot as plt
import math
from paddle.optimizer import lr
class OneCycleLR(lr.LRScheduler):
def __init__(self,
learning_rate,
total_steps=None,
pct_start=0.3,
last_epoch=- 1,
verbose=False):
self.total_steps = total_steps
self.step_size_up = float(pct_start * self.total_steps) - 1
self.step_size_down = float(self.total_steps - self.step_size_up) - 1
self.last_epoch = last_epoch
self.learning_rate = learning_rate
super(OneCycleLR, self).__init__(learning_rate, last_epoch, verbose)
def _annealing_cos(self, start, end, pct):
"Cosine anneal from `start` to `end` as pct goes from 0.0 to 1.0."
cos_out = math.cos(math.pi * pct) + 1
return end + (start - end) / 2.0 * cos_out
def get_lr(self):
self.step_num=self.last_epoch
down_step_num = self.step_num - self.step_size_up
a = self._annealing_cos(self.learning_rate * 0.00001, self.learning_rate, self.step_num / self.step_size_up)
b = self._annealing_cos(self.learning_rate, self.learning_rate * 0.00001, down_step_num / self.step_size_down)
if self.step_num < self.step_size_up:
lr_value = a
else:
lr_value = b
return lr_value
def get_scheduler(strategy,learning_rate):
if strategy=='CosineAnnealingDecay':
#使用余弦退火算法调整学习率,其周期为T_max*2个step
scheduler = lr.CosineAnnealingDecay(learning_rate, T_max=10, verbose=False)
elif strategy=="ExponentialDecay":
#指数调度 gamma的范围要尽可能的接近1,参考范围[0.9,0.99]
scheduler=lr.ExponentialDecay(learning_rate, gamma=0.9, verbose=False)
elif strategy=='InverseTimeDecay':
#提供逆时间衰减学习率的策略,即学习率与当前衰减次数成反比
scheduler = lr.InverseTimeDecay(learning_rate, gamma=0.1, verbose=False)
elif strategy=="LambdaDecay":
#该接口提供 lambda 函数设置学习率的策略
scheduler = lr.LambdaDecay(learning_rate, lr_lambda=lambda x:0.95**x, verbose=False)
elif strategy=="LinearWarmup":
#提供一种学习率优化策略-线性学习率热身(warm up)对学习率进行初步调整。在正常调整学习率之前,先逐步增大学习率。
#warmup_steps (int) - 进行warm up过程的步数。此后的epoch中的lr将一直为learning_rate
#start_lr (float) - warm up的起始学习率。
#end_lr (float) - warm up的最终学习率。
scheduler = lr.LinearWarmup(
learning_rate, warmup_steps=20, start_lr=0, end_lr=0.5, verbose=False)
elif strategy == "MultiStepDecay":
#提供一种学习率按 指定轮数 进行衰减的策略。每达到一个milestones,lr=lr*gamma
scheduler = lr.MultiStepDecay(learning_rate, milestones=[20, 40, 60], gamma=0.1, last_epoch=- 1, verbose=False)
elif strategy == "NaturalExpDecay":
#提供按自然指数衰减学习率的策略。 lr=lr*e^-gamma*epoch
scheduler = lr.NaturalExpDecay(learning_rate, gamma=0.1, verbose=False)
elif strategy == "NoamDecay":
#源自于论文:attention is all you need [2017-12-6] https://arxiv.org/pdf/1706.03762.pdf
scheduler = lr.NoamDecay(d_model=0.01, warmup_steps=20, verbose=False)
elif strategy == "PiecewiseDecay":
#提供分段设置学习率的策略
scheduler = lr.PiecewiseDecay(boundaries=[30, 60, 90], values=[0.004, 0.003, 0.002, 0.001], verbose=False)
elif strategy == "PolynomialDecay":
#提供学习率按多项式衰减的策略。通过多项式衰减函数,使得学习率值逐步从初始的 learning_rate,衰减到 end_lr 。
scheduler = lr.PolynomialDecay(learning_rate, decay_steps=20, verbose=False)
elif strategy == "ReduceOnPlateau":
#提供按性能下降的学习率策略
#一旦模型在patience个epoch内表现不再提升,将学习率降低2-10倍对模型的训练往往有益
scheduler = lr.ReduceOnPlateau(learning_rate, factor=0.5, patience=5, verbose=False)
elif strategy == "StepDecay":
#提供一种学习率按指定 间隔 轮数衰减的策略。
scheduler = paddle.optimizer.lr.StepDecay(learning_rate, step_size=5, gamma=0.8, verbose=False)
elif strategy == "OneCycleLR":
#提供一种学习率按指定 间隔 轮数衰减的策略。
scheduler = OneCycleLR(learning_rate, total_steps=60,verbose=False)
else:
scheduler=learning_rate
print(strategy)
return scheduler
#其中LRScheduler为学习率策略的基类,定义了所有学习率调整策略的公共接口。
lr_schedulers=[x for x in dir(lr) if not x.islower() and x!="LRScheduler" and x!="Tensor"]+["OneCycleLR"]
print("内置的lr_scheduler",lr_schedulers)
model = paddle.nn.Linear(10, 10)
learning_rate=0.0002
strategy='ExponentialLR'
verbose=False
#https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/optimizer/lr/CosineAnnealingDecay_cn.html
max_epoch=100
data_iters=5
for strategy in lr_schedulers:
scheduler=get_scheduler(strategy,learning_rate)
#optimizer = paddle.optimizer.SGD(learning_rate=scheduler, parameters=model.parameters())
optimizer = paddle.optimizer.AdamW(learning_rate=scheduler,parameters=model.parameters(),weight_decay=0.001)
cur_lr_list = []
plt.figure()
for epoch in range(max_epoch):
for batch in range(data_iters):
optimizer.step()
#scheduler.step()
cur_lr=optimizer.get_lr()
cur_lr_list.append(cur_lr)
#print('cur_lr:',cur_lr,epoch ,batch,iters)
if "ReduceOnPlateau" in str(type(scheduler)):
loss=epoch
scheduler.step(metrics=loss) #ReduceOnPlateau
else:
scheduler.step(epoch)
x_list = list(range(len(cur_lr_list)))
plt.plot(x_list, cur_lr_list)
plt.title(strategy)
plt.xlabel("epoch")
plt.ylabel('learning rate')
plt.savefig("pltfig/%s.jpg"%strategy)
plt.show()
原文链接:https://blog.csdn.net/a486259/article/details/124020237
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!