1. CNN算法

CNN算法原理

2. RNN算法

最早CNN算法和普通算法类似,都是从由一个输入得到另一个输出,不同的输入之间没有联系,无法实现一些场景(例如:对电影每个时间点的时间类型进行分类,因为时间是连续的,每一个时间点都是由前面的时间点影响的,也就是说输入之间有关联)

2.1 典型的序列数据

  1. 文章里文字内容
  2. 语音里音频内容
  3. 股票市场中价格走势

2.2 基本原理

RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示

在上面的示例图中 神经网络的模块 A 正在 取某个 入 x_i 并 
出一个值 h_i。循环可以使得信息可以从当前步传 到下一步。 些循
环使得 RNN 看起来非常神秘。然  如果你仔细想想  样也不比一
个正常的神经网络 于理 。RNN 可以 看做是同一神经网络的多次
赋值 每个神经网络模块会把消息传 给下一个。所以 如果我们将 
个循环展开

实现公式如下:


实现如下,这里以,用户说了一句“what time is it?”我们需要先对这句话进行分词:

3. RCNN算法

RCNN(Region with CNN feature)是卷积神经网络应用于目标检测问题的一个里程碑的飞跃。CNN具有良好的特征提取和分类性能,采用RegionProposal方法实现目标检测问题。
算法可以分为三步(1)候选区域选择。(2)CNN特征提取。(3)分类与边界回归。

接下来我将详细的介绍一下每一过程如何实现,及其里面的一些tricks。

(1)候选区域选择:区域建议Region Proposal是一种传统的区域提取方法,基于启发式的区域提取方法,用的方法是ss,查看现有的小区域,合并两个最有可能的区域,重复此步骤,直到图像合并为一个区域,最后输出候选区域。然后将根据建议提取的目标图像标准化,作为CNN的标准输入可以看作窗口通过滑动获得潜在的目标图像,在RCNN中一般Candidate选项为1k2k个即可,即可理解为将图片划分成1k2k个网格,之后再对网格进行特征提取或卷积操作,这根据RCNN类算法下的分支来决定。然后基于就建议提取的目标图像将其标准化为CNN的标准输入。

(2)CNN特征提取:标准卷积神经网络根据输入执行诸如卷积或池化的操作以获得固定维度输出。也就是说,在特征提取之后,特征映射被卷积和汇集以获得输出。

(3)分类与边界回归:实际上有两个子步骤,一个是对前一步的输出向量进行分类(分类器需要根据特征进行训练); 第二种是通过边界回归框回归(缩写为bbox)获得精确的区域信息。其目的是准确定位和合并完成分类的预期目标,并避免多重检测。在分类器的选择中有支持向量机SVM,Softmax等等;边界回归有bbox回归,多任务损失函数边框回归等 。

4. LSTM算法

LSTM是一种RNN特殊的类型,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

4.1 LSTM算法原理

下图为LSTM简单的结构,可以同RNN算法进行对比

详细算法结构如下

4.2 下面对结构中的各个部分拆解解释

1.


如上图红框的流程,称之为门,是由sigmoid函数实现,实现结果为0~1,结果为0代表这条路不能通过,1代表这条可以通过

2.

3.

4.

5.

5. CTC算法

CTC全称Connectionist temporal classification,是一种常用在语音识别、文本识别等领域的算法,用来解决输入和输出序列长度不一、无法对齐的问题。在CRNN中,它实际上就是模型对应的损失函数。

传统监督学习算法面临的问题:
假设输入序列为x=[x1,x2,x3,…,xt],对应的输出序列y=[y1,y2,y3,…,yt]

  • x和y的长度是可变的
  • x和y的长度比例也是可变的
  • x和y对应元素之间不能找到严格的对齐关系

CTC算法解决以下问题其算法原理如下

5.1 Alignment对齐

CTC的输入和输出可以是不同长度的。对于给定输入,CTC通过求和所有alignments计算其输出的概率,首先理解什么是alignment?
首先看一个简单的例子。假设输入串的长度是6,Y=[c,a,t]。我们需要一个长度为6的alignment与输入相对应,同时要能唯一映射到输出cat。一个最简单的方式是重复字符c或者a或者t,如下图所示。

但是,这种方式有个问题:我们无法区分连续的相同字符,例如,对于一个alignment=[h, h, e, l, l, l, o],我们会把它映射到‘helo’而不是‘hello’。为了解决这个问题,引入了空字符 ,它没有任何含义,映射到输出是会被简单移除。 我们可以从alignment映射到Y通过先合并重复字符再移除 的方式,如下图所示。 如果Y有两个连续的相同字符,那么必须有一个 在他们中间,这样我们就可以区分helo和hello了。

5.2 Loss Function损失函数

CTC alignment为我们提供了一个很自然的方法,可以将每个时间步长的概率转换为输出序列的概率。下图展示了大致的整个流程。

对于一对输入输出(X,Y)来说,CTC的目标是将下式概率最大化

解释一下,对于RNN+CTC模型来说,RNN输出的就是概率pt(at∣X)p_{t}(a_{t}|X)pt​(at​∣X),t表示的是RNN里面的时间的概念。乘法表示一条路径的所有字符概率相乘,加法表示多条路径。因为上面说过CTC对齐输入输出是多对一的,例如heϵlϵloϵhe\epsilon l\epsilon lo\epsilonheϵlϵloϵ与heeϵlϵlohee\epsilon l\epsilon loheeϵlϵlo对应的都是“hello”,这就是输出的其中两条路径,要将所有的路径相加才是输出的条件概率
p(Y∣X)=∑A∈AX,Y∏t=1Tpt(at∣X)p(Y|X)=\sum_{A\in\mathcal{A}_{X,Y}} \prod^{T}_{t=1}p_{t}(a_{t}|X)p(Y∣X)=∑A∈AX,Y​​∏t=1T​pt​(at​∣X)
但是对于一个输出,路径会非常的多,这样直接计算概率是不现实的,CTC算法采用动态规划的思想来求解输出的条件概率,如下图所示,该图想说明的是通过动态规划来进行路径的合并(看不懂也没关系,下面有详细的解释)

假设我们现在有输入音频X对应的标定输出Y为单词“ZOO”,为了方便解释下面动态规划的思想,现在每个字符之间还有字符串的首位插入空白占位符ϵ\epsilonϵ,得到下面结果
Z={ϵ,Z,ϵ,O,ϵ,O,ϵ}Z=\{\epsilon,Z,\epsilon,O,\epsilon,O,\epsilon\}Z={ϵ,Z,ϵ,O,ϵ,O,ϵ}

为了便于说明,先定义好下图的横纵坐标轴的含义,横轴是的时间片单位为t,纵轴为Z序列单位为s。根据CTC的对齐方式的三个特征,输入有9个时间片,标签内容是“ZOO”,P(Y|X)的所有可能的合法路径如下图


α\alphaα表示对齐结果合并后(如图3.png)节点的概率。αs,t\alpha_{s,t}αs,t​表示上图中坐标为(s,t)节点的概率,该点的概率计算分为下面两种情况:

5.3 Case1

1)如果αs,t=ϵ\alpha_{s,t}=\epsilonαs,t​=ϵ,αs,t\alpha_{s,t}αs,t​则只能由前一个字符αs−1,t−1\alpha_{s-1,t-1}αs−1,t−1​或者本身αs,t−1\alpha_{s,t-1}αs,t−1​得到
2)如果αs,t\alpha_{s,t}αs,t​不等于ϵ\epsilonϵ,但是αs,t\alpha_{s,t}αs,t​为连续字符的第二个,即αs=αs−2(αs−1=ϵ)\alpha_{s}=\alpha_{s-2}(\alpha_{s-1}=\epsilon)αs​=αs−2​(αs−1​=ϵ),则αs,t\alpha_{s,t}αs,t​只能由一个空白符αs−1,t−1\alpha_{s-1,t-1}αs−1,t−1​或者αs,t−1\alpha_{s,t-1}αs,t−1​其本身得到,而不能由前一个字符得到。

上述两种情况中,αs,t\alpha_{s,t}αs,t​可以由下式算出,其中pt(zs∣X)p_{t}(z_{s}|X)pt​(zs​∣X)表示在时刻t输出字符的概率。
αs,t=(α(s,t−1)+α(s−1,t−1))⋅pt(zs∣X)\alpha_{s,t}=(\alpha(s,t-1)+\alpha(s-1,t-1))\cdot p_{t}(z_{s}|X)αs,t​=(α(s,t−1)+α(s−1,t−1))⋅pt​(zs​∣X)

5.4 Case2

如果αs,t\alpha_{s,t}αs,t​不等于ϵ\epsilonϵ,则αs,t\alpha_{s,t}αs,t​可以由αs,t−1\alpha_{s,t-1}αs,t−1​,αs−1,t−1\alpha_{s-1,t-1}αs−1,t−1​以及αs−2,t−1\alpha_{s-2,t-1}αs−2,t−1​得来,可以表示为

αs,t=(α(s,t−1)+α(s−1,t−1)+α(s−2,t−1))⋅pt(zs∣X)\alpha_{s,t}=(\alpha(s,t-1)+\alpha(s-1,t-1)+\alpha(s-2,t-1))\cdot p_{t}(z_{s}|X)αs,t​=(α(s,t−1)+α(s−1,t−1)+α(s−2,t−1))⋅pt​(zs​∣X)

从上图可以看到,合法路径由两个起始点,输出两个终止点,最后输出的条件概率为两个终止点输出概率的和。使用这种计算方法就能高效的计算损失函数,下一步的工作表示计算梯度用于训练模型。由于P(Y|X)的计算只涉及加法和乘法,因此是可导的。对于训练集D,模型优化的目标是最小化负对数似然函数

5.4 Inference预测

当我们训练好一个RNN模型时,给定一个输入序列 X,我们需要找到最可能的输出,也就是求解

Y∗=arg⁡max⁡Yp(Y∣X)Y*=\mathop{\arg\max}_{Y}p(Y|X)Y∗=argmaxY​p(Y∣X)

求解最可能的输出有两种方案,一种是Greedy Search,第二种是beam search

5.4.1 Greedy Search

每个时间片均取该时间片概率最高的节点作为输出:

A∗=arg⁡max⁡A∐t=1Tpt(at∣X)A*= {\arg\max}_{A}\coprod t=1^Tp_{t}(a_{t}|X)A∗=argmaxA​∐t=1Tpt​(at​∣X)

这个方法最大的缺点是忽略了一个输出可能对应多个对齐方式.

5.4.2 Beam Search

Beam Search是寻找全局最优值和Greedy Search在查找时间和模型精度的一个折中。一个简单的beam search在每个时间片计算所有可能假设的概率,并从中选出最高的几个作为一组。然后再从这组假设的基础上产生概率最高的几个作为一组假设,依次进行,直到达到最后一个时间片,下图是beam search的宽度为3的搜索过程,红线为选中的假设。

6. pytorch实现LSTM算法

定义LSTM参数

import torch.nn as nn
rnn=nn.LSTM(input_size,hidden_size,numlayers,bias,batch_first,dropout)
  • input_size:输入数据X的特征值的数目。
  • hidden_size:隐藏层的神经元数量,也就是层的特征数
  • num_layers:循环神经网络的层数,默认值是 2。
  • bias:默认为True,如果为 false 则表示神经元不使用 bias偏移参数。
  • batch_first:如果设置为True,则输入数据的维度中第一个维度就是 batch 值,默认为False。默认情况下第一个维度是序列的长度,第二个维度才是 batch 第三个维度是特征数目。
  • dropout:如果不为空,则表示最后跟一个dropout层抛弃部分分数据,抛弃数据的比例由该参数指定。

实现LSTM输入数据输出数据

output,(h_n,c_n)=LSTM(input,(h0,c0))

输入参数:

  • input:输入数据input一个三维向量
  • h_0:隐藏层初始权重
  • c_0:隐藏层的初始状态
    输出数据:
  • output:输出数据
  • h_n:隐藏层的输出权重
  • c_n:隐藏层输出状态

6.1 实例

import torch
impoort torch.nn as nn
from torch.autograd import Variablernn=nn.LSTM(10,20,2)
input=Variable(torch.randn(5,3,10))
h0=Variable(torch.randn(2,3,20))
c0=Variable(torch.randn(2,3,20))
output,hn=rnn(input,(h0,c0))

RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法相关推荐

  1. 计算机图形学常见算法原理,计算机图形学常用算法及代码大全

    <计算机图形学常用算法及代码大全>由会员分享,可在线阅读,更多相关<计算机图形学常用算法及代码大全(41页珍藏版)>请在人人文库网上搜索. 1.2.1.1 生成直线的DDA算法 ...

  2. svm算法原理_机器学习——分类算法(1)

    一. K近邻 KNN算法的基本思想就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是 ...

  3. SSD算法原理介绍,包含算法结构、Loss计算、默认框计算几个方面

    一.SSD算法的介绍 1.SSD算法: 是One-stage目标检测算法中的一种,不需要region proposal阶段,可以直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结 ...

  4. python的取余算法原理_python.取余算法

    #-*- coding:utf-8-*- ''' Created on 2012-12-28 取余.取一个任意小于1 美元的金额,然后计算可以换成最少多少枚硬币.硬币有1 美分,5 美分,10 美分, ...

  5. 【算法原理】支持向量机SVM算法原理

  6. 深度学习算法原理——LSTM

    1. 概述 在循环神经网络RNN一文中提及到了循环神经网络RNN存在长距离依赖的问题,长短期记忆(Long Short-Term Memory,LSTM)网络便是为了解决RNN中存在的梯度爆炸的问题而 ...

  7. AI岗位秋招纪实:算法原理扎实才是王道,而不是调参

    当下,人工智能人才的巨大缺口,主要通过三种方式缓解:海外人才引进.高校加大培养.传统人才转行. 海外人才引进,一定程度上缓解了AI顶尖人才的极度匮乏情况,但无法满足社会对普通AI人才更为广泛的需求. ...

  8. 干货 | 非常全面的谱聚类算法原理总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 谱聚类算法是目前最流行的聚类算法之一,其性能及适用场景优于传统的聚 ...

  9. 做diff_Vue3.0时代你必须了解的:diff算法原理和优化

    关注前端公众号 [前端每日一博] 前言 面试官: 你知道 Vue3.0 Object.difineProperty和vue3.0的proxy的区别吗? 你知道 Vue3.0 diff算法原理和它有什么 ...

  10. otsu阈值分割算法原理_大津二值化算法OTSU的理解

    otsu 大津算法介绍: OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 利用阈值将原图像分成前景,背景两个图象. 前景:用n1,csum,m1来表示在当前阈值下的 ...

最新文章

  1. 如何将自己写的verilog模块封装成IP核(一)
  2. 聊聊MyBatis缓存机制
  3. 二、window下django安装及第一个应用
  4. bzoj4773 负环
  5. HashMap 与 ConcurrentHashMap
  6. Python笔记-方差分析之多因素方差分析
  7. 冰心的作品有哪些?聊一聊冰心都有哪些作品?
  8. image 微信小程序flex_第三天学习微信小程序开发总结
  9. 数据清洗与数据预处理浅析
  10. 大专读者被裁,但他却拒绝了42k的Offer?| 一名爬虫工程师自述
  11. 网站接口被恶意攻击怎么办
  12. 火灾隐患是查不完的,消防监管要着力于提升单位消防能力
  13. 不能邮箱登录的网站都是耍流氓【无力吐槽】
  14. 无缝切地图的3D赛车游戏火了,小哥花16个月用JS打造,浏览器免费就能玩
  15. 计算机网络分组交换技术有,论计算机网络数据交换技术的发展
  16. centos7下详细搭建Mongodb集群
  17. spss实现时间序列分析过程
  18. “adb”不是内部或外部命令——解决方案
  19. 解决win10下无法输入反斜杠‘\’问题
  20. PDF在转Excel免费的!在线工具!轻松搞定

热门文章

  1. mongodb 下载
  2. CCF CSP 201503-1 图像旋转
  3. 最小二乘法曲线拟合(c++实现)
  4. 基于STM32F103的多种波形示波器制作
  5. RGB YUV XYZ HSL CIE1976L*a*b* LCH的色彩空间图 色彩空间 转换公式
  6. 用计算机算e的平方为什么显示错误,计算器中出现的E是什么意思?
  7. 金税盘时钟异常的处理方法及处理流程
  8. dm9000驱动分析
  9. 九度搜索引擎点击优化_「九度搜索引擎点击优化软件」网站推广方案
  10. 【Dart语言第6篇】Dart类