1、关于warp-ctchtml
CTC能够生成一个损失函数,用于在序列数据上进行监督式学习,不须要对齐输入数据及标签,常常链接在一个RNN网络的末端,训练端到端的语音或文本识别系统。CTC论文前端
CTC网络的输入python
CTC网络的输入是一个样本(图像)通过网络(通常是CNN+RNN)计算后生成的特征向量(特征序列),这部分可参考CRNN论文linux
特征序列里各个向量是按序排布的,是从图像样本上从左到右的一个个小的区间映射过来的,能够设置区间的大小(宽度),宽度越小,得到的特征序列里的特征向量个数越多,极端状况下,能够设置区间宽度为1,这样就会生成width(图像宽度)个特征向量(做为后续RNN的输入)。git
将CNN产生的一系列(假设为width个)特征序列做为后续RNN(在CRNN中用的是Bi-LSTM)的输入,能够获得一个width维的几率矩阵,这个几率矩阵就能够做为CTC的输入,用来计算CTC loss。github
CTC网络的计算过程算法
CTC网络的计算是为了获得特征序列最可能对应的标签对象,对语音识别是一段话,对文本识别是一段文字。vim
计算特征序列里每一个特征向量(共N个)分别对应的n个可能结果的几率。若是当前的特征向量的预测结果不在样本标签列表里,就置预测结果为blank空格或下划线。计算结果从一个N维的特征序列,获得一个N×n的几率矩阵(就是上面所说的)。bash
计算上述预测的N×n的几率矩阵的全部可能结果的几率,中间涉及到去除重复字母和blank的操做。N个n维的特征向量(即N×n的几率矩阵)对应的全部可能的结果有Nn服务器
NXn个,涉及到组合学,计算全部可能几率的成本会很高,可是CTC运用了动态规划(先后向算法,这部分推荐看一下HMM)以大幅下降计算的复杂性。
CTC网络的输出
对识别过程,取出最大几率对应的结果做为识别结果输出;
对训练过程,取最大几率对应的结果跟真实标签之间的差别(计算编辑距离等方法),做为训练Loss,反向传输给前端网络。
原文连接:https://blog.csdn.net/ft_sunshine/article/details/90300938
2、pytorch环境配置warp-ctc
注:本次编译是按照https://github.com/SeanNaren/warp-ctc的instruction进行的
服务器我的帐户环境:
torch0.4.1
python3.7.0
cuda9.0
cudnn
2.1 torch0.4.1
目前pytorch的版本为pytorch1.3.1,官网“get started”提供的下载方式是针对最新版本的。对于旧版本的pytorch,
能够采用pip安装。
pytorch发布的各个版本的torch连接为:https://download.pytorch.org/whl/cu90/torch_stable.html
在官网上也能够找到旧版本。
进入pytorch官网,点击“get started”进入以下界面:
能够看到“Previous PyTorch Versions”的选项,选择,下拉,进入
COMMANDS FOR VERSIONS < 1.0.0
找到“via pip",能够找到相应的pytorch版本(不全)。
从上面的连接下载
torch-0.4.1-cp37-cp37m-linux_x86_64.whl
来自 <https://download.pytorch.org/whl/cu90/torch_stable.html>
这一版本的torch,而后进行安装。
2.2 torch0.4.1的安装
在命令行输入如下指令:
#新建一个虚拟环境
conda create -n torch0.4.1 python=3.7.0
#进入虚拟环境
conda activate torch0.4.1
#pip安装torch0.4.1
pip install torch-0.4.1-cp37-cp37m-linux_x86_64.whl
#pip安装torchvision
#若是pip安装失败,改为conda install torvision
pip install torchvision
如此,完成torch0.4.1的安装
测试
python
import torch
torch.cuda.is_available()
#输出:True
print(torch.__version__)
#输出:0.4.1
这样即完成torch0.4.1的配置了。
3、在pytorch环境编译warp-ctc
git clone https://github.com/SeanNaren/warp-ctc.git
cd warp-ctc
mkdir build
cd build
cmake ..
make
cd ../pytorch_binding
python setup.py install
可是这样出问题了!
问题一:
在服务器我的帐户下,没法使用
git clone https://github.com/SeanNaren/warp-ctc.git
git clone git@github.com:SeanNaren/warp-ctc.git
所以采用把安装包下载下来,而后在指定目录下解压,编译。
这里面zip解压后获得的文件夹名不是“warp-ctc”,须要将其改成“warp-ctc”。
而后按照:
conda activate torch0.4.1
cd warp-ctc
mkdir build
cd build
cmake ..
make
cd ../pytorch_binding
python setup.py install
进行操做
再次出现问题
问题二:
python setup.py install 时,发生错误
应该是torch0.4.1版本过于陈旧,而warp-ctc在不断更新,所以,旧版本的pytorch0.4.1缺乏编译warp-ctc的包或者接口
解决方法,参见连接
https://www.twblogs.net/a/5c2a85a1bd9eee01606d3c4c
下载旧的版本。
网上有不少教程,其中issues里面的一个解决方案时用“
ac045b6072b9bc3454fb9f9f17674f0d59373789”
来自 <https://github.com/SeanNaren/warp-ctc/issues/101>
这一版本。
具体操做以下:
而后按照上面的流程操做便可:
conda activate torch0.4.1
cd warp-ctc
mkdir build
cd build
cmake ..
make
cd ../pytorch_binding
python setup.py install
在“cmake ..“过程当中,会出现下图的问题,但对后面的”make“和”python setup.py install“彷佛没有什么影响
在执行”python setup.py install“时,可能会遇到缺乏安装包的状况,此时,直接pip install对应的包应该可以解决问题的。
我遇到的状况以下图所示:
再次执行“python setup.py install”:
配置环境变量:
执行
vi ~/.bashrc
进入配置文件(关于vim编辑问题,能够查阅vim教程)
在文件最后加入
export WARP_CTC_PATH="/home2/jiangjz/warp-ctc/build"
保存退出,而后让配置生效
source ~/.bashrc
最后进行验证:
python
import torch
from warpctc_pytorch import CTCLoss
ctc_loss = CTCLoss()
# expected shape of seqLength x batchSize x alphabet_size
probs = torch.FloatTensor([[[0.1, 0.6, 0.1, 0.1, 0.1], [0.1, 0.1, 0.6, 0.1, 0.1]]]).transpose(0, 1).contiguous()
labels = torch.IntTensor([1, 2])
label_sizes = torch.IntTensor([2])
probs_sizes = torch.IntTensor([2])
probs.requires_grad_(True) # tells autograd to compute gradients for probs
cost = ctc_loss(probs, labels, probs_sizes, label_sizes)
cost.backward()
print(cost)
来自 <https://github.com/SeanNaren/warp-ctc>
这里在“from warpctc_pytorch import CTCLoss”时报了错:
解决方法是添加环境变量(这一块有点紊乱了,可是将warp-ctc的路径添加到环境变量,应该可以解决问题)
从新运行:
具体解决方法见下面的连接:
https://github.com/SeanNaren/deepspeech.pytorch/issues/155
最后将测试过程再次贴出来: