CTC Loss和Focal CTC Loss

2024-08-24 17:58
文章标签 loss focal ctc

本文主要是介绍CTC Loss和Focal CTC Loss,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近一直在做手写体识别的工作,其中有个很重要的loss那就是ctc loss,之前在文档识别与分析课程中学习过,但是时间久远,早已忘得一干二净,现在重新整理记录下

本文大量引用了- CTC Algorithm Explained Part 1:Training the Network(CTC算法详解之训练篇),只是用自己的语言理解了一下,原论文:Connectionist Temporal Classification: Labelling UnsegmSequence Data with Recurrent Neural Networ

解决的问题

套用知乎上的一句话,CTC Loss要解决的问题就是当label长度小于模型输出长度时,如何做损失函数。
一般做分类时,已有的softmax loss都是模型输出长度和label长度相同且严格对齐,而语音识别或者手写体识别中,无法预知一句话或者一张图应该输出多长的文字,这时做法有两种:seq2seq+attention机制,不限制输出长度,在最后加一个结束符号,让模型自动和gt label对齐;另一种是给定一个模型输出的最大长度,但是这些输出并没有对齐的label怎么办呢,这时就需要CTC loss了。
在这里插入图片描述

输出序列的扩展

在这里插入图片描述

所以,如果要计算?(?│?),可以累加其对应的全部输出序列o (也即映射到最终label的“路径”)的概率即可,如下图。

在这里插入图片描述

前向和后向计算

由于我们没有每个时刻输出对应的label,因此CTC使用最大似然进行训练(CTC 假设输出的概率是(相对于输入)条件独立的)
给定输入 x x x,输出序列 o o o 的条件概率是:
p ( π ∣ x ) = ∏ y π t t , ∀ π ∈ L ′ T p(\pi|x) = \prod y^t_{\pi_t}, \forall \pi \in L^{\prime T} p(πx)=yπtt,πLT
π t \pi _t πt 是序列 o o o 中的一个元素, y y y为模型在所有时刻输出各个字符的概率,shape为T*C(T是时刻,提前已固定。C是字符类别数,所有字符+blank(不是空格,是空) , y π t t y^t_{\pi_t} yπtt 是模型t时刻输出为 π t \pi _t πt的概率

我们模型的目标就是给定输入x,使得能映射到最终label的所有输出序列o的条件概率之和最大,该条件概率就是 p ( π ∣ x ) p(\pi|x) p(πx),和模型的输出概率 y y y直接关联

那么我们如何计算这些条件概率之和呢?首先想到的就是暴力算法,一一找到可以映射到最终label的所有输出序列,然后概率连乘最后相加,但是很耗时,有木有更快的做法?联系一下HMM模型中的前向和后向算法,它就是利用动态规划求某个序列出现的概率,和此处我们要计算某个输出序列的条件概率很相似
比如HMM模型中,我们要求红白红出现的概率,我们就可以利用动态规划的思想,因为红白红包含子问题红白的产生,红白包含子问题红的产生,参考引用的图片。
而这里我们以apple这个label都可以由哪些输出序列映射过去为例(T为8):
其中的一种 _ _ a p _ p l e
在这里插入图片描述
当然其他也可以如 a p p _ p p l e,但是考虑到我们最终对输出序列的处理(两个空字符之间的重复元素会去除,字符是从左到右的,且是依次的),我们的路径(状态转移)不是随便的,根据这样的规则,我们可以找到所有可以映射到apple的输出序列

在这里插入图片描述
很明显可以看到这和HMM很像,包含很多相同子问题,可以用动态规划做

定义在时刻t经过节点s的全部前缀子路径的概率总和为前向概率 α t ( s ) \alpha_t (s) αt(s),如 α 3 ( 4 ) \alpha_3 (4) α3(4)为在时刻3所有经过第4个节点的全部前缀子路径的概率总和: α 3 ( 4 ) \alpha_3 (4) α3(4) = p(_ap) + p(aap) + p(a_p) + p(app),该节点为p
在这里插入图片描述

类似的定义在时刻t经过节点s的全部后缀子路径的概率总和为前向概率 β t ( s ) \beta_t (s) βt(s),如 β 6 ( 8 ) \beta_6 (8) β6(8)为在时刻6所有经过第8个节点的全部后缀子路径的概率总和: β 3 ( 4 ) \beta_3 (4) β3(4) = p(lle) + p(l_e) + p(lee) + p(le_),该节点为l
在这里插入图片描述

总结

在这里插入图片描述

Focal CTC Loss

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实现
在这里插入图片描述

参考论文 Focal CTC Loss for Chinese Optical Character Recognition on Unbalanced Datasets


  • 语音识别:深入理解CTC Loss原理
  • CTC Algorithm Explained Part 1:Training the Network(CTC算法详解之训练篇)
  • 隐马尔可夫(HMM)、前/后向算法、Viterbi算法 再次总结
  • 【Learning Notes】CTC 原理及实现
  • 统计学习方法-p178
    在这里插入图片描述

这篇关于CTC Loss和Focal CTC Loss的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103195

相关文章

Face Recognition简记1-A Performance Comparison of Loss Functions for Deep Face Recognition

创新点 1.各种loss的比较 总结 很久没见到这么专业的比较了,好高兴。 好像印证了一句话,没有免费的午餐。。。。 ArcFace 和 Angular Margin Softmax是性能比较突出的

【读论文】MUTUAL-CHANNEL LOSS

论文题目:《The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification》 链接:https://arxiv.org/abs/2002.04264 来源:IEEE TIP2020 细粒度分类的主要思想是找出各个子类间的可区分特征,因此文章指出要尽早在通道上进行钻研,而不是从合并

[论文笔记]Circle Loss: A Unified Perspective of Pair Similarity Optimization

引言 为了理解CoSENT的loss,今天来读一下Circle Loss: A Unified Perspective of Pair Similarity Optimization。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 这篇论文从对深度特征学习的成对相似度优化角度出发,旨在最大化同类之间的相似度 s p s_p s

SPP/SPPF/Focal Module

一、在图像的分类任务重,卷积神经网络(CNN)一般含有5层: 输入层卷积层激活层池化层全连接层 ·  全连接层通常要求输入为一维向量。在CNN中,卷积层和池化层的输出特征图会被展平(flatten)为一维向量,然后作为全连接层的输入。因此,全连接层对输入的尺寸有严格要求。 ·  第一个全连接层的输入维度必须与前一层展平后的特征向量的长度一致,这就要求前面的卷积和池化层的输出特征图尺寸必须经过

Focal Loss实现

一、序言         Focal Loss是分类常用到的损失函数,面试中也经常容易考,所以这里记录一下。 二、公式和代码         公式:         Focal Loss = -alpha*(1-pt)**gamma*log(pt)         其中alpha用来调节类别间的平衡,gamma用来平衡难例和简单例的平衡。         代码: import tor

pytorch Loss Functions

1. pytorch中loss函数使用方法示例 import torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch.autograd import Variable# 定义网络时需要继承nn.Module并实现它的forward方法,将网络中具有可学习参数的层放在构造函数__init__中# 不具有可学习参

PyTorch训练中 Loss为负数,且不断减小

在To.Tensor()中会将图像归一化,但是对于一些数据不会归一化,看看标签和数据是否在一个范围内 Pytorch1.01中ToTensor解释 Convert a PIL Image or numpy.ndarray to tensor. Converts a PIL Image or numpy.ndarray (H x W x C) in the range [0, 255] to a

tensorflow LSTM+CTC实现端到端的不定长数字串识别

转载地址: https://www.jianshu.com/p/45828b18f133 上一篇文章tensorflow 实现端到端的OCR:二代身份证号识别实现了定长18位数字串的识别,并最终达到了98%的准确率。但是实际应用场景中,常常需要面对无法确定字串长度的情况,这时候除了需要对识别字符模型参数进行训练外,还需要对字符划分模型进行训练,本文实现了上文提到的方法2,使用LST

lstm+ctc 实现ocr识别

转载地址: https://zhuanlan.zhihu.com/p/21344595 OCR是一个古老的研究领域,简单说就是把图片上的文字转化为文本的过程。在最近几年随着大数据的发展,广大爬虫工程师在对抗验证码时也得用上OCR。所以,这篇文章主要说的OCR其实就是图片验证码的识别。OCR并不是我的研究方向,我研究这个问题是因为OCR是一个可以同时用CNN,RNN两种算法都可以很好解决的

MAE、MSE、Huber loss详解

https://mp.weixin.qq.com/s/Xbi5iOh3xoBIK5kVmqbKYA