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
最後將測試過程再次貼出來: