CTC loss 初步理解1

2021-10-08 14:09:02 字數 1675 閱讀 7362

參考:

深度實踐ocr author:劉樹春

先說一下ctc有什麼用,先從應用場景下說:ctc最早被設計來解決編譯碼對不齊的問題。

在傳統的語音識別的模型中,我們對語音模型進行訓練之前,往往都要將文字與語音進行嚴格的對齊操作。

比方說上圖這週情況**得到乙個(t,c)的矩陣,但是結果卻可能是乙個長度為(t1)的序列,t1和t不一定等,這個時候如何對其就很麻煩,全部人工標註就太費事了,而且標的還不一定對,比如下圖,要把影象分割開,太費事了,這個時候ctc就上場了

先說一下crnn模型輸出是什麼樣的呢;

一般的全連線層輸出為1*c的向量,而crnn輸出的是乙個(t*c)的矩陣

該1*c的tensor輸出為d,即模型**結果為d

該模型輸出為daeb

def

decode

(self, encode_texts, encode_probs=

none

, raw=

false):

texts =

scores =

for n in

range

(len

(encode_texts)):

encode_text = encode_texts[n]

if raw:

''.join(

[self.alphabet[i -1]

for i in encode_text]))

else

: char_list =

min_score =

1for i in

range

(len

(encode_text)):

if encode_text[i]!=0

and(

not(i >

0and encode_text[i -1]

== encode_text[i]))

:-1]

)if encode_probs is

notnone

: char_prob = encode_probs[n, i, encode_text[i]

]if min_score > char_prob:

min_score = char_prob

''.join(char_list)

)return texts, scores

乙個標準的解碼過程如上所示

邏輯為如果遇到對於t[i]∈t,如果首先在該維度取max,得到當前t**的char,如果當前char為空格,則跳過,如果t[i]==t[i-1],那麼忽略當前值,其它的加入當前list的back

最終可以得到**的序列

ioctl初步理解

ioctl系統呼叫是為使用者空間建立的一種控制硬體裝置的通道。比如控制串列埠的波特率,馬達的轉速等等。是使用者空間和核心空間進行通訊的方式之一。要實現乙個ioctl,需要使用者空間和核心空間兩方面的配合。如果想要乙個硬體支援ioctl,則要在其驅動函式中加入ioctl的實現,應用程式想要通過ioct...

初步理解socket

在學習socket之前,先回顧下tcp ip協議。tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思來看tcp ip是tcp和ip協議的合稱,但實...

SVN初步理解

問題二 衝突 問題描述 為了解決超時問題,只能更新.而在更新過程中,如果幾個人修改了同一檔案的同一行 此時就會產生衝突。產生原因 版本控制器不會那麼智慧型,去決定應該使用誰的 作為最終 只能將選擇權拋給使用者,讓使用者解決。系統提供三種解決方案 p postpone,延遲處理 待會我自己處理 如果選...