CTC的直观理解(Connectionist Temporal Classification连接时序分类),单行文本时序分类识别的端到端方法

把基于概率的自动化叫做AI是否有些可笑? — David 9

原文:An Intuitive Explanation of Connectionist Temporal Classification

聊到CTC(Connectionist Temporal Classification),很多人的第一反应是ctc擅长单行验证码识别:

两组谷歌验证码示例

是的,ctc可以提高单行文本识别鲁棒性(不同长度不同位置 )。今天David 9分享的这篇文章用几个重点直观的见解把ctc讲的简洁易懂,所以在这里就和大家一起补一补ctc 。

首先ctc算不上一个框架,更像是连接在神经网络后的一个归纳字符连接性的操作

来自:https://towardsdatascience.com/intuitively-understanding-connectionist-temporal-classification-3797e43a86c

cnn提取图像像素特征,rnn提取图像时序特征,而ctc归纳字符间的连接特性。

那么CTC有什么好处?

因手写字符的随机性,人工可以标注字符出现的像素范围,但是太过麻烦,ctc可以告诉我们哪些像素范围对应的字符

手写字符的单行像素标注, 来自:https://towardsdatascience.com/intuitively-understanding-connectionist-temporal-classification-3797e43a86c

如上图标注“t”的位置出现t字符,标注o的区域出现o字符。 继续阅读CTC的直观理解(Connectionist Temporal Classification连接时序分类),单行文本时序分类识别的端到端方法

理解Hinton胶囊网络之精华浓缩版,第一部分: 胶囊网络背后的灵感与初衷(Capsule Networks)

David 9 一直想扒一扒Hinton的胶囊网络,老教授两篇论文有些晦涩,但今天发现AI³普及帖不错,只是略显冗长。。所以,精华浓缩版就呼之欲出了O(∩_∩)O~

深度CNN是Hinton老教授10年前就在重点研究的课题,胶囊网络也是Hinton早已思考的内容,所以,

第一:胶囊网络不是空穴来风的新算法,而是基于CNN的缺陷和新需求的改进。

第二,胶囊网络比CNN好在哪里??

首先,CNN牛X之处在于用类似蛮力的海量数据方式,自动把重要的分类特征找到,所以,无论图像是不是完整,我们都有理由相信CNN能够识别图中有没有“米老鼠”这个对象:

不完整的米老鼠拼图
完整的米老鼠拼图

只要CNN看到有象征米老鼠的“耳朵”和“鼻子”, CNN就认定这张图中有“米老鼠”。(哪怕拼图还没完成继续阅读理解Hinton胶囊网络之精华浓缩版,第一部分: 胶囊网络背后的灵感与初衷(Capsule Networks)

CVPR2018抢先看,DiracNets:无需跳层连接,训练更深神经网络,结构参数化与Dirac参数化的ResNet

虚拟化技术牺牲硬件开销和性能,换来软件功能的灵活性;深度模型也类似,如果把网络结构参数化,得到的模型更灵活易控,但是计算效率并不高。 — David 9

近年来深度网络结构的创新层出不穷:残差网络Inception 系列Unet,等等。。微软的残差网络ResNet就是经典的跳层连接(skip-connection):

来自:https://arxiv.org/pdf/1512.03385.pdf

上一层的特征图x直接与卷积后的F(x)对齐加和,变为F(x)+x (特征图数量不够可用0特征补齐,特征图大小不一可用带步长卷积做下采样)。这样在每层特征图中添加上一层的特征信息,可使网络更深,加快反馈与收敛。

但是ResNet也有明显的缺陷:我们无法证明把每一层特征图硬连接到下一层都是有用的;另外实验证明把ResNet变“深”,不如把ResNet变“宽”, 即,到了一定深度,加深网络已经无法使ResNet准确度提升了(还不如把网络层像Inception那样变宽)。

于是,DiracNets试图去掉固定的跳层连接,试图用参数化的方法代替跳层连接:

那么问题来了,我们怎么参数化这个被删除的跳层连接? 继续阅读CVPR2018抢先看,DiracNets:无需跳层连接,训练更深神经网络,结构参数化与Dirac参数化的ResNet

理解Hinton胶囊网络之精华浓缩版,第二部分: 胶囊网络是如何工作的?(Capsule Networks)

胶囊网络精华浓缩版第一部分中,我们就吐槽过Max pooling的一堆缺陷:

  • 虽然最大池化层可帮助辨别图像中元素的位置关系,但是有太多信息丢失(pooling操作“粗暴地”把局部相邻像素点集压缩成一个像素点)
  • 缺乏空间分层和空间推理能力,缺乏“举一反三”的能力
Max pooling图示

当我们深入看胶囊网络的工作方式,我们会感觉胶囊网络就是为改进Max Pooling而生的:

来自: https://arxiv.org/pdf/1710.09829.pdf

上图胶囊网络整体架构中,卷积层Conv1输出后,跟的不再是Max Pooling层, 而是主胶囊层(PrimaryCaps layer)数据胶囊层(DigitCaps layer)

这些胶囊层到底是如何工作的?我们先从胶囊层和一般的全连接层入手。

一般的全连接层是这样工作的:

来自:https://medium.com/ai%C2%B3-theory-practice-business/understanding-hintons-capsule-networks-part-ii-how-capsules-work-153b6ade9f66

对于上一层Max Pooling输出的所有标量(x1, x2, x3)与权重(w1,w2,w3)做卷积求和操作。最后,使用非线性激活函数 f(•)输出预测值hj 继续阅读理解Hinton胶囊网络之精华浓缩版,第二部分: 胶囊网络是如何工作的?(Capsule Networks)

8 个很棒的机器学习小抄,速查表及其解释: Machine Learning Cheat Sheets !

这期David 9给各位初学者推荐8个很棒的机器学习小抄,速查表以及我的理解,希望各位刚入坑的小伙伴能有一个总览性的理解,加速你的学习迭代:

1.  SCIKIT-LEARN 算法导览

分类只要判别类别标签,回归还要预测具体值,特征降维要找到有用的那些维度,聚类是要给未知总集区分类别,初学者除了知道以上这些问题大类, SCIKIT-LEARN 算法导览还提供一些具体的选择细节。 继续阅读8 个很棒的机器学习小抄,速查表及其解释: Machine Learning Cheat Sheets !

TensorFlow手把手入门之分布式TensorFlow — 3个关键点,把你的TensorFlow代码重构为分布式!

分布式架构就像哈姆雷特,一千个人眼中有一千种分布式方式 — David 9

对于机器学习模型,分布式大致分两类:模型分布式数据分布式:

模型分布式非常复杂和灵活, 它把整个机器学习模型分割,分散在多个节点上,在每个节点上计算模型的各个部分, 最后把结果拼接起来。如果你造了一个并行性很高的深度网络,比如这个,那就更棒了。你只要在每个节点上,计算不同的层,最后把各个层的异步结果通过较为精妙的方式汇总起来。

而我们今天要手把手教大家的是数据分布式。模型把数据拷贝到多个节点上, 每次算Epoch迭代的时候,每个节点对于一个batch的梯度都会有一个计算值,一个batch结束后,所有节点把梯度值汇总起来(ps参数服务器的任务就是汇总所有参数更新),从而进行更新。这就会导致每个batch的计算都比非分布式方法精准。相对非分布式,并行方法下,同样的迭代次数,收敛较快。 继续阅读TensorFlow手把手入门之分布式TensorFlow — 3个关键点,把你的TensorFlow代码重构为分布式!

用TensorFlow可视化卷积层的方法

深度学习中对于卷积层的可视化可以帮助理解卷积层的工作原理与训练状态,然而卷积层可视化的方法不只一种。最简单的方法即直接输出卷积核和卷积后的filter通道,成为图片。然而也有一些方法试图通过反卷积(转置卷积)了解卷积层究竟看到了什么。

在TensorFlow中,即使是最简单的直接输出卷积层的方法,网上的讲解也参差不齐,David 9 今天要把可运行的方法告诉大家,以免大家受到误导。

废话少说,最简单的方法在此:

如果你有一个卷积层,我们以Tensorflow自带的cifar-10训练为例子:

with tf.variable_scope('conv1') as scope:
  kernel = _variable_with_weight_decay('weights',
                                       shape=[5, 5, 3, 64],
                                       stddev=5e-2,
                                       wd=0.0)
  conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')
  biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))
  pre_activation = tf.nn.bias_add(conv, biases)
  conv1 = tf.nn.relu(pre_activation, name=scope.name)
  _activation_summary(conv1)

继续阅读用TensorFlow可视化卷积层的方法