CTC解码在推断时,同一个标签序列对应的原生序列的结尾会有两种情况:1.以字符结尾;2.以blank结尾。不同的结尾往下增长时的缩放策略不同,比如以字符结尾:*a遇到a会缩放为*a;以blank(用“-”表示)结尾:*a-遇到a会被缩放为*aa。所以在增长过程的每一步,标签序列的概率都会使用两个变量存储,一个负责累加以字符结尾的原生序列概率,另一个负责累加以blank结尾的原生序列概率,两者相互独立,互无交集。增长后,再将这两个概率相加(log_sum_exp)表示这一个标签序列的总概率。然后取top beam_size后再往下增长。

序列增长时会有四种情况:

  1. 原生序列结尾任意,当前值为blank, 标签序列不变, 更新以blank结尾的概率;
  2. 原生序列结尾为blank,当前值为相同字符(指与目前标签序列的最后一个字符相同), 标签序列更新, 更新非blank概率;
  3. 原生序列结尾为字符,当前值为相同字符, 标签序列不变, 更新非blank概率;
  4. 原生序列结尾任意,当前值为不同字符, 标签序列更新, 更新非blank概率。

注:

1.原生序列是指未缩放的序列,如aa-bbc-,aabbcc 对应的标签序列都为abc。

2.这里的概率指得都是对数概率:lp=log(softmax(logits))。所以原生序列增长时,其概率lp用“+”更新,相当于概率积后取log。而原生序列和标签序列是多对一关系,同一个标签序列的概率用其对应的多个原生序列概率的log_sum_exp表示(log(exp(lp1)+exp(lp2),...exp(lpk)),相当于概率和后再规范为对数概率表示。

import mathdef log_sum_exp(lps):_inf = -float('inf')if all(lp == _inf for lp in lps):return _infmlp = max(lps)return mlp + math.log(sum(math.exp(lp - mlp) for lp in lps))def beam_search_ctc(probs,bms=10,blank=0):'''probs: 概率空间,shape为[sequence_len,vocab_size]的torch tensorbms: beam_sizeblank: blank index'''_inf = -float("inf")seqs =[((idx.item(),),(lp.item(),_inf)) if idx.item()!=blankelse (tuple(),(_inf,lp.item()))for lp,idx in zip(*probs[0].topk(bms))]for i in range(1,probs.size(0)):new_seqs = {}for seq,(lps,blps) in seqs:   last = seq[-1] if len(seq) > 0 else Nonefor lp, idx in zip(*probs[i].topk(bms)):lp=lp.item()idx=idx.item()  if idx == blank :nlps,nblps= new_seqs.get(seq,(_inf,_inf))new_seqs[seq]=(nlps,log_sum_exp([nblps,lps+lp,blps+lp]))elif idx ==last:#aanlps,nblps= new_seqs.get(seq,(_inf,_inf))new_seqs[seq]=(log_sum_exp([nlps,lps+lp]),nblps)#a-anew_seq = seq + (idx,)nlps,nblps= new_seqs.get(new_seq,(_inf,_inf))new_seqs[new_seq]=(log_sum_exp([nlps,blps+lp]),nblps)else:new_seq = seq + (idx,)nlps,nblps= new_seqs.get(new_seq,(_inf,_inf))new_seqs[new_seq]=(log_sum_exp([nlps,lps+lp,blps+lp]),nblps)new_seqs = sorted(new_seqs.items(),key=lambda x: log_sum_exp(list(x[1])),reverse=True)seqs = new_seqs[:bms]     return seqs

CTC束搜索解码原理和Pytorch实现(CTC Prefix BeamSearch Decode)相关推荐

  1. NMS和Soft-NMS的原理和Pytorch代码实现

    NMS都不会,做什么Detection! Non-maximum suppression(非极大值抑制)算法 NMS原理: 首先得出所有的预测框集合B. 对应框的得分Scores, NMS(IoU)阈 ...

  2. 混合高斯模型原理和Lucas-Kanade方法介绍

    运动估计之混合高斯模型原理和Lucas-Kanade方法介绍 1. 简述混合高斯模型的基本原理,以及通过混合高斯模型进行背景建模的基本思想. 背景建模的思想:利用帧之间的像素变化来进行判断,像素灰度值 ...

  3. 学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理

    前言 这是学习源码整体架构系列第七篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现.本篇文章学习的是实际仓库的代码. 学习源码整体 ...

  4. Mybatis插件原理和PageHelper结合实战分页插件(七)

    今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...

  5. HBase学习指南之HBase原理和Shell使用

    HBase学习指南之HBase原理和Shell使用 参考资料: 1.https://www.cnblogs.com/nexiyi/p/hbase_shell.html,hbase shell 转载于: ...

  6. IAP的原理和stm8的IAP

    一.引出(IAP的原理和stm8上实现IAP的问题) 具有IAP功能的单片机,程序可以分为两部分:IAP和APP.APP是用来实现真正功能的程序,而IAP是用来远程重新编程APP的程序.单片机上电时会 ...

  7. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  8. 计算机网络原理和OSI模型与TCP模型

    计算机网络原理和OSI模型与TCP模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机网络的概述 1.计算机网络的定义 计算机网络是一组自治计算机的互连的集合 2.计算机 ...

  9. HTTPS原理和CA证书申请

    转载自:HTTPS原理和CA证书申请(满满的干货) 众所周知,WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的方式,https默认采用443,对于 ...

最新文章

  1. Angular开发实践(一):环境准备及框架搭建
  2. 程序员能力矩阵 你属于哪一层?
  3. 实现简单递归c++实现
  4. 使用C#程序处理PowerPoint文件中的字符串
  5. Day 30: Play Framework —— Java开发者的梦想框架
  6. com/mysql/jdbc/sqlerror_com.mysql.jdbc.sqlerror
  7. python中的匿名函数lambda
  8. Qt文档阅读笔记-Broadcast Sender Example解析
  9. Linux中chmod用法
  10. TestBed静态测试步骤
  11. MFC USB调试助手
  12. pycharm双击打不开,没有反应,下列方法亲测有用!
  13. 电脑故障维修判断指导大全(联想内部文件)[网络转载]
  14. linux crontab清理脚本,crontab定时清理日志
  15. HIT深入理解计算机系统大作业
  16. 【安全知识分享】PPTX|典型事故和应急救援案例分析(25页)(附下载)
  17. 微信浏览器、手机版浏览器、pc版浏览器网站的缓存怎么清理? 比较好的三点解决方案
  18. 2018拼多多校招【最大乘积】Python解法
  19. 第三方浏览器内核嵌入一、Crosswalk
  20. [乐意黎原创] 2014年全国和云南省中级会计师成绩、分数段、过关率及年龄段统计分析

热门文章

  1. Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
  2. ZStack-ZCCE-网络实验-VPC网络创建
  3. 雅虎将收购什么类型公司?梅耶尔:移动!移动!移动!
  4. iPhone 导入照片显示时间不是拍摄时间
  5. 案例—考勤后台管理系统需求
  6. Dichotomy poj River Hopscotch
  7. 俄罗斯方块游戏shell编程代码
  8. 我猜这将是程序员副业接单赚外快的最好的平台!
  9. 6. 中学生心理辅导
  10. 显示隐藏Html元素(div等)