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中英文语料库
首先,在Github上搜寻了一番,发现了以下项目:
https://github.com/zzw922cn/Automatic_Speech_Recognition
https://github.com/pandeydivesh15/AVSR-Deep-Speech
但是无奈他们使用的TIMIT数据集是收费的,只好放弃了。
最终,找到了如下项目:
https://github.com/sdhayalk/TensorFlow_Speech_Recognition_Challenge
这里用到的数据集也就是著名的Speech Commands Datasets。
这里只实验了最简单的那个模型,遗憾的是该代码并不能直接使用,需要相应的预处理:
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]]
虽然英语是表音文字,但直接分解字母作为标签显然是不太精确的。
这里需要用到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是一个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中文参考
一个用于音频剪辑处理的工具。免费但不开源。
官网:
http://www.ocenaudio.com/
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 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
音乐检索研究中使用的工具
Takuya Ooura是东京大学的教授,他写了一套数值计算的软件叫做Ooura,其中包含了FFT的实现。这也是aubio默认的FFT实现。缺点是只支持2的整数次方的FFT采样。
代码:
http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
这是作者收集的FFT库的列表:
http://www.kurims.kyoto-u.ac.jp/~ooura/fftlinks.html
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库。
代码:
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-国际多通道语音分离和识别大赛
https://mp.weixin.qq.com/s/_hVHettrQLNZRTrO7Qh8qg
简单的音频识别
loss:训练集损失值
accuracy:训练集准确率
val_loss:测试集损失值
val_accruacy:测试集准确率
以下5种情况可供参考:
train loss 不断下降,test loss不断下降,说明网络仍在学习;(最好的)
train loss 不断下降,test loss趋于不变,说明网络过拟合;(max pool或者正则化)
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;(检查dataset)
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;(减少学习率)
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。(最不好的情况)
参考:
https://www.cnblogs.com/Timeouting-Study/p/12591448.html
TensorFlow中loss与val_loss、accuracy和val_accuracy分别是什么含义
最近对Lenet的训练过程作了一个有趣的测试。
下表以accuracy达到90%,作为测试的目标:
Batch size | Epochs | Iterations | 计算量(以batch size=4的一个iteration为基准1) | 时间 |
---|---|---|---|---|
4 | 4 | 15000 * 4 = 60000 | 60000 | 350min * 4 = 1400min |
8 | 7 | 7500 * 7 = 52500 | 52500 * 2 = 105000 | 190min * 7 = 1330min |
16 | 13 | 3750 * 13 = 48750 | 48750 * 4 = 195000 | 95min * 13 = 1235min |
32 | 25 | 1875 * 25 = 46875 | 46875 * 8 = 375000 | 65min * 25 = 1625min |
64 | 50 | 938 * 50 = 46900 | 46900 * 16 = 750400 | 41min * 50 = 2050min |
从上表可以看出增大batch size可以减少iteration的数量,但是该方法有极限,不可任意小。
增大batch size会增加计算量,但是由于设备IO和计算量的平衡,并不是batch size越小,运行时间就越短。
他是做图网络分类的,同一个数据集之前的测试准确率只有80出头,后来几篇文章就飙到了接近90,师兄怎么都复现不出来,后来开源了代码一看,好家伙,之前训练测试是二八分,新文章直接变成了三七分,就在dataloader里改的,但是作者文章完全没有提及,而且师兄把分布换成最开始的数据分布之后,那个新方法的效果还比不上原来的baseline。
https://www.zhihu.com/question/265953178
如何评价深度学习相关顶级期刊论文难复现的问题?
https://www.zhihu.com/question/25097993
深度学习调参有哪些技巧?
您的打赏,是对我的鼓励