热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

软件工程应用与实践(六):PaddleOCR文字识别器策略四

2021SCSDUSC目录一、前情回顾1.PP-OCR文字识别策略2.本文策略——学习率衰减的简单介绍学习率衰减介绍学习率衰减的常见参数几种固定学习率衰减策略介绍学习率衰

2021SC@SDUSC


目录

一、前情回顾

1.PP-OCR文字识别策略

2.本文策略——学习率衰减的简单介绍

学习率衰减介绍

学习率衰减的常见参数

几种固定学习率衰减策略介绍

 学习率衰减的warm-up策略

Paddle OCR所涉及的学习率衰减策略

二、学习率衰减策略与代码分析

1.PP-OCR的学习率衰减策略

2.代码分析

总结






一、前情回顾


1.PP-OCR文字识别策略

        策略的选用主要是用来增强模型能力和减少模型大小。下面是PP-OCR文字识别器所采用的九种策略:


  • 轻主干,选用采用 MobileNetV3 large x0.5 来权衡精度和效率;
  • 数据增强,BDA (Base Dataaugmented)和TIA (Luo et al. 2020);
  • 余弦学习率衰减,有效提高模型的文本识别能力;
  • 特征图辨析,适应多语言识别,进行向下采样 feature map的步幅修改;
  • 正则化参数,权值衰减避免过拟合;
  • 学习率预热,同样有效;
  • 轻头部,采用全连接层将序列特征编码为预测字符,减小模型大小;
  • 预训练模型,是在 ImageNet 这样的大数据集上训练的,可以达到更快的收敛和更好的精度;
  • PACT量化,略过 LSTM 层;

2.本文策略——学习率衰减的简单介绍


  • 余弦学习率衰减,有效提高模型的文本识别能力

学习率衰减介绍

       深层神经网络的参数学习主要是通过梯度下降方法来寻找一组可以最小化结构风险的参数。 在梯度下降中学习率的取值非常关键,如果过大可能不会收敛,过小则收敛速度太慢。

        通常的策略在一开始采用大的学习率保证收敛,在收敛到最优点附近时要小些以避免来回震荡。因此,比较简单直接的学习率调整可以通过学习率衰减(Learning Rate Decay)的方式来实现。

        学习率衰减策略可以分为两种:固定策略的学习率衰减和自适应学习率衰减,其中固定学习率衰减包括分段衰减、逆时衰减、指数衰减等,自适应学习率衰减包括AdaGrad、 RMSprop、 AdaDelta等。一般情况,两种策略会结合使用。


学习率衰减的常见参数


参数名称参数说明
learning_rate初始学习率
global_step用于衰减计算的全局步数,非负,用于逐步计算衰减指数
decay_steps衰减步数,必须是正值,决定衰减周期
decay_rate衰减率
end_learning_rate最低的最终学习率
cycle学习率下降后是否重新上升
alpha最小学习率
num_periods衰减余弦部分的周期数
initial_variance噪声的初始方差
variance_decay衰减噪声的方差
boundaries学习率衰减边界
values不同阶段对应学习率
staircase是否以离散的时间间隔衰减学习率
power多项式的幂















几种固定学习率衰减策略介绍

基本学习率衰减


  1. piecewise decay  分段常数衰减, 在训练过程中不同阶段设置不同的学习率,便于更精细的调参。在目标检测任务如Faster RCNN 和 SSD 的训练中都采用分段常数衰减策略,调整学习率。策略效果如下:

    preview

     

  2. exponential decay  指数衰减:学习率以指数的形式进行衰减,其中指数函数的底为decay_rate, 指数为 global_step / decay_steps。策略效果如下(图一为连续,图二为离散):

     

  3. natural exponential decay  自然指数衰减:学习率以自然指数进行衰减,其中指数函数底为自然常数e, 指数为-decay_rate * global_step / decay_step, 相比指数衰减具有更快的衰减速度。策略实现效果如下(图一为连续,图二为离散):

  4. polynomial decay  多项式衰减:调整学习率的衰减轨迹以多项式对应的轨迹进行。其中(1 - global_step / decay_steps) 为幂函数的底; power为指数,控制衰减的轨迹。策略效果实现如下(幂指数分别为0.5、1.0、2.0):

    preview

     

      

  5. cosine decay  余弦衰减:学习率以cosine 函数曲线进行进行衰减, 其中余弦函数的周期为  , 自变量为 

     策略效果如下: 

  6. linear cosine decay  线性余弦衰减:动机式在开始的几个周期,执行warm up 操作,线性余弦衰减比余弦衰减更具aggressive,通常可以使用更大的初始学习速率。其中余弦函数的周期为  ,自变量为  。实现效果如下: 

 


 学习率衰减的warm-up策略

        它可以分为两个阶段:第一个阶段,学习率从很小的学习率(warm-up learning rate)增加到基学习率(base learning rate),这一阶段也称为warm-up阶段。第二阶段,从基学习开始,执行学习率衰减。

        warm-up 动机如下:


  1. 对于第一阶段,由于刚开始训练时,模型的权重(weights)是随机初始化的,这时模型对于数据的“分布”理解为零,在初始训练阶段, 每个输入数据对模型来说都是新的, 模型会根据数据对模型权重进行修正。此时若选择一个较大的学习率,如果这时候学习率就很大,极有可能导致模型对开始的数据“过拟合”,后面要通过多轮训练才能拉回来,浪费时间。当训练了一段(几个epoch)后,模型已经对数据集分布有一定了解,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型跑偏,所以可以适当调大学习率。这个过程就可以看做是warm-up。

  2. 对于第二阶段,当模型一定阶段(如十几个epoch)后,模型的分布就已经比较固定了,模型慢慢趋于稳定。这时再执行学习率衰减, 可以使得模型获得更快的收敛速度。warm-up 有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳。


Paddle OCR所涉及的学习率衰减策略


  1. 带有warm-up的线性学习率衰减——Linear learning rate decay。

  2. 带有warm-up的余弦学习率衰减——Cosine learning rate decay :lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)。效果图如下(图一未预热,图二预热):

    preview

  3. 带有warm-up的分段学习率衰减——Piecewise learning rate decay。效果图如下(图一未预热,图二预热):

  4. 带有warm-up的循环余弦学习率衰减——Cyclical cosine learning rate decay

二、学习率衰减策略与代码分析


1.PP-OCR的学习率衰减策略

        学习率是控制学习速度的超参数。学习率越低,损失值变化越慢。虽然使用较低的学习率可以确保不会错过任何局部最小值,但这也意味着收敛速度较慢。在训练的早期,权值处于随机初始化状态,因此我们可以设置较大的学习率,以更快地收敛。在训练的后期,由于权值接近最优值,所以应该使用较小的学习率。余弦学习速率衰减已成为首选的提高模型精度的学习速率降低策略。在整个训练过程中,余弦学习速率衰减保持较大的学习速率,因此其收敛速度较慢,但最终收敛精度较好。下图是不同的学习速率衰减方式的比较:

 


2.代码分析

代码位置:


主要代码段:


  1. lr_scheduler.py 循环余弦学习率衰减

    class CyclicalCosineDecay(LRScheduler):def __init__(self,learning_rate,T_max,cycle=1,last_epoch=-1,eta_min=0.0,verbose=False):"""Cyclical cosine learning rate decay 周期余弦学习率衰减A learning rate which can be referred in https://arxiv.org/pdf/2012.12645.pdfArgs:learning rate(float): learning rateT_max(int): maximum epoch numcycle(int): period of the cosine decaylast_epoch (int, optional): The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.eta_min(float): minimum learning rate during trainingverbose(bool): whether to print learning rate for each epoch"""super(CyclicalCosineDecay, self).__init__(learning_rate, last_epoch,verbose)self.cycle = cycleself.eta_min = eta_mindef get_lr(self):if self.last_epoch == 0:return self.base_lrreletive_epoch = self.last_epoch % self.cyclelr = self.eta_min + 0.5 * (self.base_lr - self.eta_min) * \(1 + math.cos(math.pi * reletive_epoch / self.cycle))return lr

  2. learning_rate.py 其他学习率衰减

class Linear(object):"""Linear learning rate decay 线性学习率衰减Args:lr (float): The initial learning rate. It is a python float number.epochs(int): The decay step size. It determines the decay cycle.end_lr(float, optional): The minimum final learning rate. Default: 0.0001.power(float, optional): Power of polynomial. Default: 1.0.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,epochs,step_each_epoch,end_lr=0.0,power=1.0,warmup_epoch=0,last_epoch=-1,**kwargs):super(Linear, self).__init__()self.learning_rate = learning_rateself.epochs = epochs * step_each_epochself.end_lr = end_lrself.power = powerself.last_epoch = last_epochself.warmup_epoch = round(warmup_epoch * step_each_epoch)def __call__(self):learning_rate = lr.PolynomialDecay(learning_rate=self.learning_rate,decay_steps=self.epochs,end_lr=self.end_lr,power=self.power,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_rateclass Cosine(object):"""Cosine learning rate decay 余弦学习率衰减lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)Args:lr(float): initial learning ratestep_each_epoch(int): steps each epochepochs(int): total training epochslast_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_rateself.T_max = step_each_epoch * epochsself.last_epoch = last_epochself.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_rateclass Step(object):"""Piecewise learning rate decay 分段学习率衰减的分段Args:step_each_epoch(int): steps each epochlearning_rate (float): The initial learning rate. It is a python float number.step_size (int): the interval to update.gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma`` .It should be less than 1.0. Default: 0.1.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_size,step_each_epoch,gamma,warmup_epoch=0,last_epoch=-1,**kwargs):super(Step, self).__init__()self.step_size = step_each_epoch * step_sizeself.learning_rate = learning_rateself.gamma = gammaself.last_epoch = last_epochself.warmup_epoch = round(warmup_epoch * step_each_epoch)def __call__(self):learning_rate = lr.StepDecay(learning_rate=self.learning_rate,step_size=self.step_size,gamma=self.gamma,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_rateclass Piecewise(object):"""Piecewise learning rate decay 分段学习率衰减Args:boundaries(list): A list of steps numbers. The type of element in the list is python int.values(list): A list of learning rate values that will be picked during different epoch boundaries.The type of element in the list is python float.last_epoch (int, optional): The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate."""def __init__(self,step_each_epoch,decay_epochs,values,warmup_epoch=0,last_epoch=-1,**kwargs):super(Piecewise, self).__init__()self.boundaries = [step_each_epoch * e for e in decay_epochs]self.values = valuesself.last_epoch = last_epochself.warmup_epoch = round(warmup_epoch * step_each_epoch)def __call__(self):learning_rate = lr.PiecewiseDecay(boundaries=self.boundaries,values=self.values,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.values[0],last_epoch=self.last_epoch)return learning_rateclass CyclicalCosine(object):"""Cyclical cosine learning rate decay 循环余弦学习率衰减Args:learning_rate(float): initial learning ratestep_each_epoch(int): steps each epochepochs(int): total training epochscycle(int): period of the cosine learning ratelast_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,cycle,warmup_epoch=0,last_epoch=-1,**kwargs):super(CyclicalCosine, self).__init__()self.learning_rate = learning_rateself.T_max = step_each_epoch * epochsself.last_epoch = last_epochself.warmup_epoch = round(warmup_epoch * step_each_epoch)self.cycle = round(cycle * step_each_epoch)def __call__(self):learning_rate = CyclicalCosineDecay(learning_rate=self.learning_rate,T_max=self.T_max,cycle=self.cycle,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



总结

        以上是今天PP-OCR文字识别模型的学习率衰减策略的相关介绍。之后将会继续介绍PP-OCR文字识别模型的其他策略。


推荐阅读
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • 深入解析 org.hibernate.event.spi.EventSource.getFactory() 方法及其应用实例 ... [详细]
  • 字符串对比竟也暗藏玄机,你是否认同?
    在探讨字符串对比技术时,本文通过两个具体案例深入剖析了其背后的复杂性与技巧。首先,案例一部分详细介绍了需求背景、分析过程及两种不同的代码实现方法,并进行了总结。接着,案例二同样从需求描述出发,逐步解析问题并提供解决方案,旨在揭示字符串处理中容易被忽视的关键细节和技术挑战。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 本文介绍了Android动画的基本概念及其主要类型。Android动画主要包括三种形式:视图动画(也称为补间动画或Tween动画),主要通过改变视图的属性来实现动态效果;帧动画,通过顺序播放一系列预定义的图像来模拟动画效果;以及属性动画,通过对对象的属性进行平滑过渡来创建更加复杂的动画效果。每种类型的动画都有其独特的应用场景和实现方式,开发者可以根据具体需求选择合适的动画类型。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • MySQL 错误:检测到死锁,在尝试获取锁时;建议重启事务(Node.js 环境)
    在 Node.js 环境中,MySQL 数据库操作时遇到了“检测到死锁,在尝试获取锁时;建议重启事务”的错误。本文将探讨该错误的原因,并提供有效的解决策略,包括事务管理优化和锁机制的理解。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 题目《UVa 11978 福岛核爆问题》涉及圆与多边形交集面积的计算及二分法的应用。该问题的核心在于通过精确的几何运算与高效的算法实现来解决复杂图形的面积计算。在实现过程中,特别需要注意的是对多边形顶点的平移处理,确保所有顶点包括最后一个顶点 \( p[n] \) 都经过正确的位移,以避免因细节疏忽导致的错误。此外,使用循环次数为50次的二分法能够有效提高算法的精度和稳定性。 ... [详细]
  • 优化后的标题:校园互联新方案:10397连接教育未来 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
author-avatar
莪乜子12
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有