CTC+pytorch編譯配置warp-CTC

-牧野-發表於2018-05-04

CTC


CTC可以生成一個損失函式,用於在序列資料上進行監督式學習,不需要對齊輸入資料及標籤,經常連線在一個RNN網路的末端,訓練端到端的語音和文字識別系統。CTC論文地址: http://www.cs.toronto.edu/%7Egraves/icml_2006.pdf


CTC網路的輸入


CTC網路的輸入是一個樣本(影象)經過網路(一般是CNN+RNN)計算後生成的特徵向量(特徵序列)。

特徵序列裡各個向量是按序排布的,是從影象樣本上從左到右的一個個小的區間對映過來的,可以設定區間的大小(寬度),寬度越小,獲得的特徵序列裡的特徵向量個數越多,極端情況下,可以設定區間寬度為1,這樣就會生成width(影象寬度)個特徵向量。


CTC網路的計算過程


CTC網路的計算是為了得到特徵序列最可能對應的標籤物件,對語音識別是一段話,對文字識別是一段文字。

1. 計算特徵序列裡N個特徵向量分別對應的n個可能結果的概率。如果當前的特徵向量的預測結果不在樣本標籤列表裡,就置預測結果為blank空格或下劃線。計算結果從一個N維的特徵序列,得到一個N×n的預測序列。

2.  計算N×n的預測序列對應的所有可能的結果的概率,中間涉及到去除重複字母和blank的操作。
N×n個特徵向量對應的所有可能結果有n的N次方個,涉及到組合學,計算所有可能概率的成本會很高,但是CTC運用了動態規劃以大幅降低計算的複雜性。


CTC網路的輸出


對識別過程,取出最大概率對應的結果作為識別結果輸出;
對訓練過程,取最大概率對應的結果跟真實標籤之間的差異(計算編輯距離等方法),作為訓練Loss,反向傳輸給前端網路。

CTC計算過程示意圖:




pytorch安裝


GPU版本的:

conda install pytorch=0.3.0 cuda80 -c soumith

CPU版本的:

conda install pytorch=0.3.0 -c soumith

參考官網: https://pytorch.org/#pip-install-pytorch



warp-CTC安裝


warp-CTC是百度開源的一個可以應用在CPU和GPU上高效並行的CTC程式碼庫,對CTC演算法進行了並行處理。

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

新增環境變數:

gedit ./.bashrc
export WARP_CTC_PATH=/home/xxx/warp-ctc/build


驗證pytorch中warp-CTC是否可用GPU例子:

cd /home/xxx/warp-ctc/pytorch_binding/tests
python test_gpu.py

OK輸出:


或:

import torch
from torch.autograd import Variable
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 = Variable(torch.IntTensor([1, 2]))
label_sizes = Variable(torch.IntTensor([2]))
probs_sizes = Variable(torch.IntTensor([2]))
probs = Variable(probs, requires_grad=True) # tells autograd to compute gradients for probs
cost = ctc_loss(probs, labels, probs_sizes, label_sizes)
cost.backward()
print('PyTorch bindings for Warp-ctc')

PyTorch bindings for Warp-ctc參考:https://github.com/SeanNaren/warp-ctc

相關文章