一、关于warp-ctc

  CTC可以生成一个损失函数,用于在序列数据上进行监督式学习不需要对齐输入数据及标签,经常连接在一个RNN网络的末端,训练端到端的语音或文本识别系统。CTC论文

  CTC网络的输入

CTC网络的输入是一个样本(图像)经过网络(一般是CNN+RNN)计算后生成的特征向量(特征序列),这部分可参考CRNN论文

特征序列里各个向量是按序排布的,是从图像样本上从左到右的一个个小的区间映射过来的,可以设置区间的大小(宽度),宽度越小,获得的特征序列里的特征向量个数越多,极端情况下,可以设置区间宽度为1,这样就会生成width(图像宽度)个特征向量(作为后续RNN的输入)。

将CNN产生的一系列(假设为width个)特征序列作为后续RNN(在CRNN中用的是Bi-LSTM)的输入,可以得到一个width维的概率矩阵,这个概率矩阵就可以作为CTC的输入,用来计算CTC loss。

CTC网络的计算过程

CTC网络的计算是为了得到特征序列最可能对应的标签对象,对语音识别是一段话,对文本识别是一段文字。

计算特征序列里每个特征向量(共N个)分别对应的n个可能结果的概率。如果当前的特征向量的预测结果不在样本标签列表里,就置预测结果为blank空格或下划线。计算结果从一个N维的特征序列,得到一个N×n的概率矩阵(就是上面所说的)。

计算上述预测的N×n的概率矩阵的所有可能结果的概率,中间涉及到去除重复字母和blank的操作。N个n维的特征向量(即N×n的概率矩阵)对应的所有可能的结果有Nn

NXn个,涉及到组合学,计算所有可能概率的成本会很高,但是CTC运用了动态规划(前后向算法,这部分推荐看一下HMM)以大幅降低计算的复杂性。

CTC网络的输出

  对识别过程,取出最大概率对应的结果作为识别结果输出;

对训练过程,取最大概率对应的结果跟真实标签之间的差异(计算编辑距离等方法),作为训练Loss,反向传输给前端网络。

原文链接:https://blog.csdn.net/ft_sunshine/article/details/90300938

二、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的配置了。

三、在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

最后将测试过程再次贴出来:

服务器个人环境下pytorch0.4.1编译warp-ctc遇到的问题及解决方法的更多相关文章

  1. [RabbitMQ]Windows环境下rabbitmqclt(Command Line Tools)出现Erlang distribution failed错误的解决方法

    摘要 当使用rabbitmqctl时出现Erlang distribution failed,把%SystemRoot%Windows\System32\config\systemprofile下的. ...

  2. Linux 环境下umount, 报 device is busy 的问题分析与解决方法

    在Linux环境中,有时候需要挂载外部目录或硬盘等,但当想umount时,却提示类似“umount:/home/oracle-server/backup:device is busy”这种提示. 出现 ...

  3. 使用layui异步请求上传图片在tp5.1环境下出现“请对上传接口返回json”的错误的解决方法

    正常情况下返回json数据使用return json(); 但是使用layui会报错,然后想到了使用json_encode()包装一下用一个变量接收后,再使用return();返回接收json格式的变 ...

  4. Linux环境下mysql报错:bash: mysql: command not found 的解决方法

    # mysql -u root-bash: mysql: command not found 原因:这是由于系统默认会查找/usr/bin下的命令. 如果这个命令不在这个目录下,当然会找不到命令. 我 ...

  5. android源码环境下用mmm/mm编译模块,输出编译log到文件的方法

    android源码环境下用mmm/mm编译模块,输出编译log到文件的方法 1,在android目录下直接用mmm命令编译, log信息保存在android目录下 mmm packages/apps/ ...

  6. Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)

    https://blog.csdn.net/shinesun001/article/details/54312402 在centos 7环境下搭建好Lnmp环境之后,发现安装的php有好多扩展都没有安 ...

  7. 阿里云ECS服务器Linux环境下配置php服务器(二)--phpMyAdmin篇

    上一篇讲了PHP服务器的基本配置,我们安装了apache,php,还有MySQL,最后还跑通了一个非常简单的php页面,有兴趣的朋友可以看我的这篇博客: 阿里云ECS服务器Linux环境下配置php服 ...

  8. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  9. 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...

随机推荐

  1. C#下的时间测试(用于计算方法执行时间)

    public class Timing { private TimeSpan m_StartTime; private TimeSpan duringTime; public Timing() //构 ...

  2. 页面直接导出为PDF文件,支持分页与页边距

    将WEB页面直接导出为pdf文件是经常会用到的一个功能,尤其是各种报表系统.总结了一下目前几种主流的做法: 在后端用代码生成pdf文件,比如iText一类: 在后端抓取页面并生成pdf文件,比如pha ...

  3. //某父元素(.class)底下相同class的第二的取值

    //某父元素(.class)底下相同class的第二的取值 var v = $('.cell-right').find(".startime").eq(1).val();

  4. python with语句与contextlib

    参考链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/ with语句用于异常处理,适用于存在资源访问的场合,无论 ...

  5. Java中级—转发和重定向的区别

    在设计Web应用程序的时候,经常需要把一个系统进行结构化设计,即按照模块进行划分,让不同的Servlet来实现不同的功能,例如可以让其中一个Servlet接收用户的请求,另外一个Servlet来处理用 ...

  6. spring cloud 框架源码 activiti工作流 vue.js html 跨域 前后分离 springboot

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  7. 【新手篇】搭建DCN漏洞靶机及简单的SQL手工注入

    很多新手小白入门后发现想要学好“网安”技术,除了掌握基础理论知识,更需要经常模拟不同的漏洞环境,但是如果使用外网服务器练习,会存在一定风险,因此能够搭建一个本地的模拟环境去测试漏洞将是一个不错的方案. ...

  8. maven 学习---NetBeans IDE集成Maven

    NetBeans6.7更新版本已经内置对Maven支持.如遇以前的版本,Maven插件在插件管理器中可用.我们正在使用NetBeans在这个例子中使用6.9. 在NetBeans一些特点如下 您可以从 ...

  9. 简单的深度神经网络实现——使用PyTorch

    使用的数据集是MNIST,预期可以达到98%左右的准确率. 该神经网络由一个输入层,一个全连接层结构的隐含层和一个输出层构建. 1.配置库和配置参数 import torch import torch ...

  10. 201871010124-王生涛《面向对象程序设计(java)》第十四周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...