-
Notifications
You must be signed in to change notification settings - Fork 5
/
lstm_001.txt
300 lines (162 loc) · 9.35 KB
/
lstm_001.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
https://blog.csdn.net/antkillerfarm/article/details/84232764
word2vec, LSTM Speech Recognition实战, 图数据库
antkillerfarm 2018-11-19 10:34:13 824 收藏 1
版权
word2vec
word2vec是Google于2013年开源推出的一个用于获取word vector的工具包。作者是Tomas Mikolov。
Github:
https://github.com/tmikolov/word2vec
注:Tomas Mikolov,捷克布尔诺科技大学博士。先后在Google、Facebook担任研究员。
word2vec包中还有一个word2phrase的程序,这个程序可以根据统计信息由单词生成短语。考虑到中文的字和词之间的关系,实际上也可以用它来进行无先验数据的分词。
注:NLP中的先验数据,最出名的当属分词词典。除此之外,还包括HMM的转移矩阵表等。
其一般方法为:
1.对原始语料按字切分,以空格分隔,相当于认为一个字就是一个词,即单字成词。
2.使用word2phrase组字成词。
time ./word2phrase -train 1.txt -output 2.txt -threshold 100 -debug 2
3.由于word2phrase最多只考虑到2-gram。因此,对于超过3个字以上的词语,需要迭代执行word2phrase。
我以金庸的小说为语料进行测试。从结果来看,这种方法对于人名、地名、武功招式名等专有名词,分词效果较好。但对于具有语法结构的句子,分词效果较差。比如“那人”其实是两个单字词,但却被word2phrase认为是一个双字词。
./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
./distance vectors.bin
训练之后的结果文件中,保存着每个词的向量。可将binary选项设为0,来查看相应结果的明文。
明文和二进制数据之间的转换可使用gensim工具,参见:
https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/python/ml/nlp/hello_gensim.py
参考:
http://wei-li.cnblogs.com/p/word2vec.html
文本深度表示模型Word2Vec
http://www.cnblogs.com/wowarsenal/p/3293586.html
用中文把玩Google开源的Deep-Learning项目word2vec
http://www.jianshu.com/p/05800a28c5e4
使用word2vec训练wiki中英文语料库
LSTM Speech Recognition实战
数据集
首先,在Github上搜寻了一番,发现了以下项目:
https://github.com/zzw922cn/Automatic_Speech_Recognition
https://github.com/pandeydivesh15/AVSR-Deep-Speech
但是无奈他们使用的TIMIT数据集是收费的,只好放弃了。
最终,找到了如下项目:
https://github.com/sdhayalk/TensorFlow_Speech_Recognition_Challenge
复现结果
这里只实验了最简单的那个模型,遗憾的是该代码并不能直接使用,需要相应的预处理:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/python/ml/tensorflow/TensorFlow_Speech_Recognition_Challenge
这里还有一个坑,该项目只使用了11类声音,而把其他19类都归为unknown。这会导致unknown的权重过重,测试准确度虚高,(无脑分类为unknown都有60%以上的精度)但实际结果很差。需要使用一些方法处理数据的不平衡。
最终,复现结果精度大概在75%~80%之间。训练时间大概要16小时。
炼丹一
把类别扩展到30类,精度略高,但也就80%上下。如此费时的训练,只有这点结果,实在让人丧气。于是参考warpCTC,进行炼丹。
1.LSTM由3层减为1层。
2.使用CTC loss。(参见《深度学习(二十九)》)
在识别验证码的例子中,假如有两幅图,分别是123和4567,那么Label就是:
[[1,2,3,0]
[4,5,6,7]]
1
2
虽然英语是表音文字,但直接分解字母作为标签显然是不太精确的。
这里需要用到ARPABET表,该表可以看做是国际音标的另一种表示法:
https://en.wikipedia.org/wiki/ARPABET
还有如下工具可以将英文单词转换为ARPABET表示:
http://www.speech.cs.cmu.edu/tools/lextool.html
这个工具所使用的词典在:
http://svn.code.sf.net/p/cmusphinx/code/trunk/cmudict/
精度大为提高到90%。
炼丹二
1.将LSTM改为BiLSTM。
2.使用1x1的卷积处理频谱。给feature map以不同的权重,有助于强化有效声音,弱化噪声。
3.使用3层FC。只对同一time step的频点做FC,不跨time step。
原理参见《深度学习(三十)》中的Deep speech 2。
精度再次提高到96%。如果不做第1步的修改的话,精度大概是94%,但计算快了很多,大概2个小时。
fftw
fftw是一个C语言的FFT库,由MIT的Matteo Frigo和Steven G. Johnson编写。
fft的实现往简单的说,也就几十行代码。这里这个3M+的庞然大物当然没这么简单。它使用了汇编、并行等加速手段,还支持DCT和DST变换。
官网:
http://fftw.org/
代码:
https://github.com/FFTW/fftw3
然而,由于fftw的代码是自动生成的,因此这个代码库实际上只供专业人士使用。普通用户直接在官网下载源代码包即可。
参考:
https://blog.csdn.net/congwulong/article/details/7576012
FFTW中文参考
aubio
aubio是一个C语言的音频分析库,提供了提取fbank、MFCC等特征的能力。
找到aubio的过程,堪称曲折。最近要移植MFCC提取功能,到一嵌入式平台。因此要求代码必须是C语言。
1.Kaldi是C++写的,不合要求。
2.scipy.fftpack的核心是用C和Fortran写的,其实最主要的部分是Fortran写的。
3.使用Java语言的话,jMIR是个不错的选择。
代码:
https://github.com/aubio/aubio
安装:
sudo apt-get install python3-aubio python-aubio aubio-tools libaubio-dev
aubio的fft结果是以极坐标的格式保存的,而LibROSA则是以平面坐标的格式保存的。
示例1:测试环境是否安装好了,包括C和python环境。
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/aubio/1
示例2:python:获取wav文件的频谱。C:log重定向+读取wav文件内容。
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/aubio/2
参考:
http://www.cnblogs.com/daleloogn/p/4510137.html
音乐检索研究中使用的工具
Ooura
Takuya Ooura是东京大学的教授,他写了一套数值计算的软件叫做Ooura,其中包含了FFT的实现。这也是aubio默认的FFT实现。
代码:
http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
这是作者收集的FFT库的列表:
http://www.kurims.kyoto-u.ac.jp/~ooura/fftlinks.html
LibROSA
LibROSA是一个分析音乐和语音的Python库。
官网:
http://librosa.github.io/
代码:
https://github.com/librosa/librosa
文档:
http://librosa.github.io/librosa/
参考:
http://www.cnblogs.com/xingshansi/p/6816308.html
音频特征提取——librosa工具包使用
python_speech_features
python_speech_features是另一个分析音乐和语音的Python库。
代码:
https://github.com/jameslyons/python_speech_features
文档:
https://python-speech-features.readthedocs.io/en/latest/
参考
论文:
《Small-footprint Keyword Spotting Using Deep Neural Network and Connectionist Temporal Classifier》
这篇文章是蚂蚁金服提出的Keyword Spotting(KWS)的论文,它和本次实战所用的Speech Commands Datasets契合度很高,值得参考。
http://mp.weixin.qq.com/s/-QQjz61VAOVcWE7j-EJPhg
谈谈蚂蚁金服的语音唤醒系统
这里还有两篇炼丹文:
https://zhuanlan.zhihu.com/p/28133530
一次CTC-RNN调参经历
http://www.tbluche.com/ctc_and_blank.html
The intriguing blank label in CTC
http://spandh.dcs.shef.ac.uk/chime_challenge/chime2016/
CHiMe – Computational Hearing in Multisource Environments-国际多通道语音分离和识别大赛
图数据库
Neo4j
Neo4j大概算是最著名的图数据库了,它具有成熟和健壮的数据库的所有特性。相对于关系数据库来说,图数据库(Graph Database)善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。
官网:
https://neo4j.com/
参考:
http://blog.csdn.net/xingxiupaioxue/article/details/71747284
如何将大规模数据导入Neo4j
https://mp.weixin.qq.com/s/_Zm88TyBcXAZ4LeQOuJCHA
管理neo4j的用户
https://mp.weixin.qq.com/s/dzPZTqUhWKIiKj2o7OkMbA
Neo4j的python操作库Neo4j-Driver
https://mp.weixin.qq.com/s/mupuyM7m_41eOzQc7LGRRw
Neo4j的python操作库Neomodel
https://mp.weixin.qq.com/s/YVo6KduIvckYKH53fjDogw
neo4j扩展包APOC的图算法
neo4j-graph-algorithms
Neo4j Graph Algorithms扩展包,是一个关于图算法的jar包,集成了一些常见的图算法,比如社区发现,路径扩展,中心点计算,PageRank等。
代码:
https://github.com/neo4j-contrib/neo4j-graph-algorithms
openCypher
openCypher是基于Neo4j的查询语言Cypher开发的,Cypher用于在图数据库中存储和检索数据。在图数据库领域,目前还没有像关系数据库中访问数据的SQL这样的通用查询语言标准。
openCypher的目标是通过简化存储、分析,以及用于访问图数据模型的工具平台,促进图处理和分析的使用。技术厂商可以在他们的工具和平台内实现Cypher。
官网:
http://www.opencypher.org/
RedisGraph
RedisGraph是Redis推出的基于Redis的图数据库。
官网:
http://redisgraph.io/
参考:
https://mp.weixin.qq.com/s/BzQBy6AoMXXpjsdGyXh1zA
揭秘RedisGraph: Redis内嵌高性能内存图数据库