CTC是2006年的论文Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks中提到的,论文地址: http://www.cs.toronto.edu/~graves/icml_2006.pdf

论文中CTC的定义是这样的:把对未分割的序列数据label的任务叫做Temporal Classification,把使用RNNs对未分割的序列数据label叫做Connectionist Temporal Classification(CTC) 。与之相对的是,把对数据序列的每一个time-step或者frame独立label 叫做framewise classification

tensorflow中的相关实现在 /tensorflow/python/ops/ctc_ops.py

1. ctc_loss, 计算ctc loss

def ctc_loss(labels, inputs, sequence_length,
preprocess_collapse_repeated=False,
ctc_merge_repeated=True, time_major=True):

这个类执行softmax操作,所以输入应该是LSTM输出的线性映射

inputs, 最内部维度大小是num_classes,代表“num_labels +1” 个类别,其中num_labels是真实的balebs的数目,最大值“num_labels-1”是为blank label保留的

例如,如果一个单词包含3个labels ‘[a, b, c]’,则num_classes =4, 且labels的索引号是 ‘{a:0, b:1, c:2, blank:3}’

至于参数 preprocess_collapse_repeated 和 ctc_merge_repeated:

如果 preprocess_collapse_repeated = True ,在计算ctc之前,重复的labels会被合并为一个labels。这种预处理对下面这种情况是有用的:如果训练数据是强制对齐得到的,会包含不必要的重复。

如果 ctc_merge_repeated = False,那么伴随ctc计算的深入,重复的非blank将不会被合并,会被解释为独立的labels。这是ctc的简化的非标准的版本

具体见下表

  • preprocess_collapse_repeated = False,ctc_merge_repeated = True:经典CTC,输出的真实的重复的中间带有blanks类别,也可以通过解码器解码,输出不带有blanks的重复类别
  • preprocess_collapse_repeated = True,ctc_merge_repeated = False:因为在training之前,input 的labels已经合并重复项了,所以不会输出重复的类
  • preprocess_collapse_repeated = False,ctc_merge_repeated = False:输出重复的中间带有blank的类别,但是通常不需要解码器合并重复项
  • preprocess_collapse_repeated = True,ctc_merge_repeated = True: 未测试,非常可能不会学会输出重复类

参数:

labels: int32 SparseTensor, 标准的输出,稀疏矩阵

inputs: 3-D float tensor . 计算得到的logits。 如果time_major = False, shape:batch_size x max_time x num_classes. 如果 time_major = True, shape:max_time x batch_size x num_classes

sequence_length: 1-D int32 向量, batch_size

输出:

1-D float tensor,size:[batch], 概率的负对数

2. ctc_beam_search_decoder: 对输入的logits执行beam search 解码

def ctc_beam_search_decoder(inputs, sequence_length, beam_width=100,
top_paths=1, merge_repeated=True):

如果 merge_repeated = True, 在输出的beam中合并重复类。这意味着如果一个beam中的连续项( consecutive entries) 相同,只有第一个提交。即,如果top path 是‘A B B B ’,返回值是‘A B’(当merge_repeated = True),‘A B B B ’ (当merge_repeated = False)

参数:

inputs: 3-D float tensor , shape:max_time x batch_size x num_classes

sequence_length: 1-D int32 向量, batch_size

beam_width: int scalar>=0

top_paths: int scalar>=0, <= beam_width, 输出解码后的数目

输出:

元组:(decoded, log_prob)

其中:

decoded : a list of length top_paths, 每一个是一个稀疏矩阵

log_prob : matrix , shape (batch_size x top_paths)

tensorflow源码分析——CTC的更多相关文章

  1. tensorflow源码分析

    前言: 一般来说,如果安装tensorflow主要目的是为了调试些小程序的话,只要下载相应的包,然后,直接使用pip install tensorflow即可. 但有时我们需要将Tensorflow的 ...

  2. tensorflow源码分析——BasicLSTMCell

    BasicLSTMCell 是最简单的LSTMCell,源码位于:/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py.BasicLSTMC ...

  3. tensorflow源码分析——LSTMCell

    LSTMCell 是最简单的LSTMCell,源码位于:/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py.LSTMCell 继承了RNN ...

  4. 图解tensorflow 源码分析

    http://www.cnblogs.com/yao62995/p/5773578.html https://github.com/yao62995/tensorflow

  5. [tensorflow源码分析] Conv2d卷积运算 (前向计算,反向梯度计算)

  6. [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

    [图解tensorflow源码] 入门准备工作 附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html  tensorf ...

  7. [图解tensorflow源码] 入门准备工作

     tensorflow使用了自动化构建工具bazel.脚本语言调用c或cpp的包裹工具swig.使用EIGEN作为矩阵处理工具.Nvidia-cuBLAS GPU加速计算库.结构化数据存储格式prot ...

  8. [图解tensorflow源码] [原创] Tensorflow 图解分析 (Session, Graph, Kernels, Devices)

    TF Prepare [图解tensorflow源码] 入门准备工作 [图解tensorflow源码] TF系统概述篇 Session篇 [图解tensorflow源码] Session::Run() ...

  9. TensorFlow源码框架 杂记

    一.为什么我们需要使用线程池技术(ThreadPool) 线程:采用“即时创建,即时销毁”策略,即接受请求后,创建一个新的线程,执行任务,完毕后,线程退出: 线程池:应用软件启动后,立即创建一定数量的 ...

随机推荐

  1. zuul开发实战(限流,超时解决)

    什么是网关 API Gateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能 统一接入 * 智能路由 * AB测试.灰度测试 ...

  2. grunt接触

    grunt使用 以下内容均为已经安装好grunt,具体grunt的安装过程不述,可以参考grunt的相关资料. 1.项目初始化grunt 在项目文件夹的根目录下面,打开命令行grunt init,执行 ...

  3. vue学习【三】vue-router路由显示多页面

    大家好,我是一叶,今天是七夕,单身狗的我还在这里写踩坑文.在这里还是要祝大家早日脱单(能不能脱单自己心里没个数吗).本篇继续踩坑,在单页面上展示多页的内容,大家的想法是什么,估计大家第一印象会是ifr ...

  4. Delphi 布尔型数据

  5. 引用vector里的元素被删除后,引用会怎么样?

    引用的定义不多说,直接看做变量的别名就可以了.有一天写着写着代码,突然想到,如果对vector里某个元素设置引用后,将这个元素从vector里删除会怎么样?我思考了下,认为那个元素会被删除,但是引用还 ...

  6. python socket使用

    自学python,先在菜鸟教程网自学,然后买了本书看.又从同事那里淘到了某个培训学校python教学视频,查缺补漏.视频是用python3.0讲的,讲解的很不错,中间有让写作业,这个我很喜欢.这几天看 ...

  7. win32创建工具栏的自定义图标

    注意点:使用LoadImage函数加载bmp图片,这里特指BMP图片,其实LoadImage可以加载很多格式的图片 HBITMAP bitmap = (HBITMAP)LoadImage((HINST ...

  8. stdarg的使用

    // 可变参头文件 <stdarg.h> // 主要依赖五个宏: va_list,va_start, va_arg, va_end, va_copy // 其中 va_copy 是 c99 ...

  9. 初始Turtle

    ---恢复内容开始--- turtle库介绍 海龟作图最初源自20世纪60年代的Logo(创建于1967年,是一种教育编程语言)编程语言. 常用函数说明 画笔的属性 设置画笔的宽度   t.pensi ...

  10. 【Spring】Spring-Session-Data-Redis实现session共享

    前言 在开发中遇到一个关于用户体验的问题,每次当运维进行更新重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session来保存的,而session对象是由服务 ...