訓練CRNN時,關於ctc loss的幾點注意事項

2021-10-06 02:06:29 字數 1872 閱讀 2340

這個ctc_loss很魔性,訓練crnn虐了我幾個來回。

我的資料集大小不一,我是先等比例縮小到固定高度為32,寬度不定。

常見三個問題:

1.ctc loss error: invalidargumenterror: not enough time for target transition sequence.

2.ctc loss error: invalidargumenterror: sequence_length(b) <= time

3.ctc_loss error 「no valid path found.」 (這個錯誤對模型收斂沒有很大影響,只是出錯的那乙個batch引數沒有更新優化。如果這個錯誤很少,可以忽略。如果這個錯誤很多的話就建議用下面方法優化一下訓練集。)

導致這三個問題的原因,就是label_length 和input_length的取值問題。

1. crnn乙個主要優點就是可以識別任意長度的。在訓練的時候,先統一將padding到乙個固定的很長的寬度。然後input_length設定為你等比例縮小後,padding之前的的寬除以四。部分**如下:

img = image.open(imagepath).convert('l')

resizedimg = cv2.resize(img, (int(img.shape[1] * (32 / img.shape[0])), 32))

input_length[i] = resizedimg.shape[1] // 4

2. label_length很簡單理解,就是ground truth的長度。

3. 如果你以為這樣就完事大吉可以訓練你就錯了。因為你的可能有不合格的存在。導致問題3出現,loss變為inf。

4. 所以在訓練前,應該過濾一遍所有訓練集和驗證集的。ctc_loss在計算**結果和真值的loss的時候,會在你真值label中重複的字元之間插入空符,所以必須將label_length加上空符個數大於input_length的刪除掉。而**中的2,是我考慮有可能在label的開頭和末尾存在空符。(我並沒有驗證這個想法,只是為了保險起見。)舉個例子,你高度為32,寬度為160,那麼input_length=40。label='abbbccddddcccaa',label_length=15,經過計算repreat_number為2(bbb)+1(cc)+3(dddd)+2(ccc)+1(aa),然後再加上開頭結果的空符數2,最終等於11。也就是說必須滿足label_length(15)+repreat_number(11)<=input_length(40)的才是合格的。部分**如下:

img = np.array(image.open(imgrootpath + '/' + imgname).convert('l'))

resizedimg = cv2.resize(img, (int(img.shape[1] * (32 / img.shape[0])), 32))

l = [len(list(g)) for k, g in itertools.groupby(label)]

repeat_number = 0

for n in l:

if n > 1:

repeat_number += (n - 1)

input_length = resizedimg.shape[1] // 4

if len(label)+repeat_number+2 > input_length:

continue

關於caffe訓練網路時用到的命令

訓練網路 sudo sh build tools caffe train solver examples mnist train lenet.sh solver 必選引數。乙個protocol buffer型別的檔案,即模型的配置檔案。如 build tools caffe train solver...

關於訓練時Loss值不變的情況分析

今天在搭建簡單模型訓練花資料的時候發現loss,始終為乙個數。loss 實際輸出值和標籤值之間的誤差距離。在分類任務中,如何評判輸出和期望之間的接近?交叉熵 刻畫了兩個概率分布之間的距離。是分類問題中應用比較廣的一種損失函式。反向更新權重 有了損失函式,知道了實際輸出和真實值之間的距離,用梯度求導更...

使用Fluid訓練模型時,使用多卡訓練報錯

enforcenotmet failed to find dynamic library libnccl.so libnccl.so cannot open shared object file no such file or directory please specify its path co...