语音识别RNA的代码实现

语音识别

1.基本的模型和原理

1.1 语音识别的基本概念和前世今生
音素(phoneme):是根据语音的自然属性划分出来的最小语音单位,依据音节里的发音动作来分析,一个动作构成一个音素。 音素分为元音与辅音两大类。
语音识别前世:
GMM+HMM:
孤立词识别是通过直接计算距离,但不是比较声学波形,而是声学特征。每一帧(20~50ms)的数据小于一个音素,但包含2到3个周期。
循环神经网络
注意力机制

2.代码实现论文

2.1 TensorFlow的学习
tip1:注意TensorFlow的方法基本都是需要将tf.Function(的首字母大写的)
tip2:feed方法,可在整个工程中任意地方加入补丁————这个不是很明白
tip3:session的含义和用法
tf.Session()可以可理解为作为前端可执行程序(Python代码)和后端C++代码的连接由于 tf.Session 拥有物理资源(例如 GPU 和网络连接),因此通常(在 with 代码块中)用作上下文管理器,并在您退出代码块时自动关闭会话。您也可以在不使用 with 代码块的情况下创建会话,但应在完成会话时明确调用 tf.Session.close 以便释放资源。
如何使用tensorflow来做语音识别
tip4:placeholder的意义,提前申请一块内存,需要给申请的内存先却确定数据类型,
在run的时候传入参数,在传入参数之时可以采用feed_dic{name1:[value],name2:[value]}的字典的格式。
tip5:激励函数的选择
CNN中一一般选择relu,在RNN中一般选择relu或者tanh函数
tip6:如何搭建RNN(LSTM )的模型?如何训练?如何写loss function?代码结构如何安排?
tip7:dropout是什么?——解决过拟合的问题
只采用一部分的数据进行拟合,不采用所有数据,一般dropout的值为0.2-0.3,不超过0.5
关于整个端到端语音识别的过程
我想搞清楚CTC和RNA还有RNN-T的区别,这样就可以利用现有的代码进行修改和运用了。
关于前向后向算法的运用:
因为在HMM模型中,选择最优路径用遍历法的算法复杂度非常大,因此不能再用暴力的方法去求解,而要采用一种复杂度更低的算法去简化整个计算过程。
tip8: tf.sparsetensor()函数,即张量的稀疏表示。
TensorFlow表示一个稀疏张量,作为三个独立的稠密张量:indices,values和dense_shape.在Python中,三个张量被集合到一个SparseTensor类中,以方便使用.如果你有单独的indices,values和dense_shape张量,SparseTensor在传递给下面的操作之前,将它们包装在一个对象中.
具体来说,该稀疏张量SparseTensor(indices, values, dense_shape)包括以下组件,其中N和ndims分别是在SparseTensor中的值的数目和维度的数量:

indices:density_shape[N, ndims]的2-D int64张量,指定稀疏张量中包含非零值(元素为零索引)的元素的索引.例如,indices=[[1,3], [2,4]]指定索引为[1,3]和[2,4]的元素具有非零值.
values:任何类型和dense_shape [N]的一维张量,它提供了indices中的每个元素的值.例如,给定indices=[[1,3], [2,4]]的参数values=[18, 3.6]指定稀疏张量的元素[1,3]的值为18,张量的元素[2,4]的值为3.6.
dense_shape:density_shape[ndims]的一个1-D int64张量,指定稀疏张量的dense_shape.获取一个列表,指出每个维度中元素的数量.例如,dense_shape=[3,6]指定二维3x6张量,dense_shape=[2,3,4]指定三维2x3x4张量,并且dense_shape=[9]指定具有9个元素的一维张量.
2.2 Pytorch的学习
tip1:torch.size()可以得到张量的类型
tip2:torch.view(,)可以改变tensor的维度
torch.item()可以得到真实的number而不是张量
tip3:将numpyl里的narray()格式转换成tensor(),以及反过来

a = torch.rand(5,3)
b = a.numpy()
c = torch.from_numpy(b)

tip4:如何定义一个神经网络:
定义一些具有学习参数(权重)的神经网络
迭代输入数据集
通过网络处理输入
计算损失
将渐变传播回网络参数
更新参数(一般采用梯度下降)
关于pytorch中的backward()函数:
主要有几个标志位:
requires_grad
a.如果对于某Variable 变量 x ,其 x.requires_grad == True , 则表示 它可以参与求导,也可以从它向后求导。
默认情况下,一个新的Variables 的 requires_grad 和 volatile 都等于 False 。
b.requires_grad具有传递性
c.凡是参与运算的变量(包括 输入量,中间输出量,输出量,网络权重参数等),都可以设置 requires_grad
d.只有标量才能直接使用 backward(),即loss.backward() , pytorch 框架中的各种nn.xxLoss(),得出的都是minibatch 中各结果 平均/求和 后的值。如果使用自定义的函数,得到的不是标量,则backward()时需要传入 grad_variable 参数,这一点详见博客 https://sherlockliao.github.io/2017/07/10/backward/ 。
tip5:任何可以改变tensor内容的操作都会在方法名后加一个下划线’_’
out.backward()和操作out.backward(torch.Tensor([1.0]))是等价的

2.3 LSTM的学习
在LSTM中,——call——方法一次只可以进一步
tf.nn.dynamic_rnn()方法可以一次进多步
可以理解为在LSTM/RNN里面,state是一个很重要的参数,在计算outputs的时候,一般都会得到state的值,即第u步隐藏层的输出,用于对下一步的输入,而且对于LSTM来说,输入数据的维度一般也是和CNN一样的类似图片的格式(batch_size,time_step,input_size),very very interesting
完整的LSTM类本身就可以实现projection层,但是是不是可以在这个线性的投影层加入池化操作存疑。

3.如何实现该框架?用tf

首先是数据处理和特征提取,最后得到的batch_input是(batch_size,1600,200,1)的四维特征数据,表现在直观上每一根 sample是一个语谱图
第一层神经网络是CNN用来下采样,计算经过卷积核卷积之后的输出维度的公式如下:
在以下计算演示均省略掉了 Bias ,严格来说其实每个卷积核都还有一个 Bias 参数。
关于卷积核的bias如何操作也是一个问题啊###########

深度学习代码写法tips

1.关于tensorflow中的所谓流程控制函数tf.identity()和tf.control_dependencies()
tf.control_dependencies()括号中的op在update前就会被执行,然后tf.identy()其实也是一个op,这个op会在执行完内部的op之后被执行,一般用于修改数据,y = tf.identity(x),表示修改y的值。
https://www.jianshu.com/p/61d00f400d3b
一个很好的关于tf中变量作用域的文章

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值