2018年6月13日,终于爬出坑了,还好没放弃~
无论你碰到什么事情,需要使用百度搜索时,务必在搜索工具这里调整为搜索最新的网页。最新!最新!最新!重要的事情说三遍。
本篇文档主要介绍Ubuntu16.04 系统下使用pytorch库(cpu版)编译配置warp-CTC。关于百度开源库warp-CTC的更多介绍,请移步这里[1]。
百度开源库warp-CTC长时间未更新维护,很容易出现各种版本兼容性问题,最终导致warp-CTC配置失败。正是由于在编译配置过程中,反复出现这种兼容性问题,我在坑里爬了好几天,就差各种脏话都要蹦出来了。本着前人种树后人乘凉的精神,在这里写下这篇文档,希望能帮助到后来人。
系统环境
- Ubuntu16.04 系统
- Anaconda2-5.2.0-Linux-x86_64 [2]
caffe
无GPU
安装及配置
本部分分别介绍pytorch和warp-CTC的安装与编译配置。
pytorch的安装与配置
尽管pytorch到我写下这篇文档时已经更新到0.5.0+版本了,但是SeanNaren/warp-ctc项目目前只兼容pytorch 0.4.0版本。所以安装过程中,请不要使用git clone法安装 pytorch,而是选用conda进行安装。
- pytorch 0.4.0版本安装
conda install pytorch=0.4.0 -c soumith 在这一步,除了可能提示因为网速不好需要让你重新安装这种问题,pytorch 0.4.0版本安装基本不会出现其他什么问题的报错。
- pytorch 0.4.0 导入测试
Python环境下,导入pytorch包,确认pytorch是否安装成功。
import torch
print torch.__version__输出结果即为所安装pytorch包的版本号,如下所示:
0.4.0warp-CTC的安装与编译配置
- warp-CTC的安装与编译配置
git clone https://github.com/SeanNaren/warp-ctc.git
cd warp-ctc
mkdir build; cd build
cmake ..
make生成了可执行文件test-cpu,执行命令:
./test-cpu输出结果以下,代表编译成功。
Running CPU tests
Tests pass温馨提示:执行到这里,还不算结束哈~请看下面非常关键的一步。
- pytorch_binding安装
cd pytorch_binding
python setup.py install如果你是按照我以上步骤一步一步执行的,这一步安装应该非常顺利。
在我之前安装过程中,因为各种兼容性报错安装失败n次。我一开始安装的pytorch不是0.5.0+版本,在执行pytorch_binding安装过程中,出现了以下报错:
~/.../anaconda2/lib/python2.7/site-packages/torch/utils/ffi/../../lib/include/TH/generic/THTensor.h:10:16: note: forward declaration of ‘THTensor {aka struct THTensor}’
~/.../warp-ctc/pytorch_binding/src/binding.cpp:50:35: error: invalid use of incomplete type ‘THTensor {aka struct THTensor}’如果你也遇到这样的报错提示,请按我前面所写方法,安装pytorch 0.4.0版本。
warp-CTC测试
在SeanNaren/warp-ctc项目中附有测试程序,可用于测试是否通过。原测试程序好像没有输出结果,因此我增加了print结果输出。
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输出结果:
tensor([ 2.4629])一切搞定~
参考链接
[1] 百度开源项目warp-CTC
https://github.com/baidu-research/warp-ctc[2] Anaconda镜像下载:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda2-5.2.0-Linux-x86_64.sh更多精彩项目及分享,请关注我的个人公众号:gbxiao992