2017-02-27 101 views
2

我只是用tensorflow(R1.0)CTC損耗層開始,有一個有點困惑的「標籤」輸入如何設計標籤tensorflow的CTC損失層

在tensorflow的API文檔,它說

labels:一個int32 SparseTensor。 labels.indices [i,:] == [b,t]表示labels.values [i]存儲(批量b,時間t)的id。 labels.values [I]必須承擔值在[0,num_labels)

  1. 是並[b,t]的和值[I]的意思是有一個標籤 「的值[I]」 在 「t」 的序列「b」的批次?
  2. 它說價值必須在[0,num_labels),但對於一個稀疏張量,除了某些特定的地方,幾乎到處都是0,所以我不知道應該如何使ctc的稀疏張量像
  3. 例如,如果我有一個簡短的手勢視頻,並且它有一個標籤「1」,我應該將所有時間步的輸出標記爲「1」,還是隻將最後一個時間步標記爲「1」,並將其他標記爲「空白」?

謝謝!

回答

3

爲了解決你的問題:
1.文檔中的符號在這裏似乎有點誤導,作爲輸出標記指數t不一定是一樣的輸入時間片,它只是索引輸出序列。可以使用不同的字母,因爲輸入和輸出序列沒有明確對齊。否則,你的斷言似乎是正確的。我在下面舉一個例子。

  1. Zero是序列輸出標籤中的有效類。 TensorFlow CTC實現中的所謂空白標籤是最後一個(最大)類,它應該不會在您的地面實況標籤中出現。所以如果你正在編寫一個二進制序列分類器,你會有三個類,0(說「關」),1(「開」)和2(CTC的「空白」輸出)。

  2. CTC損失用於標記序列輸入,序列輸出。如果您只有 序列輸入的單個類別標籤輸出,則最好在RNN單元的最後一個時間步的輸出上使用softmax交叉熵損失。

如果你最終使用CTC損失,你可以看到我是如何通過讀卡器在這裏建造的訓練序列:How to generate/read sparse sequence labels for CTC loss within Tensorflow?

作爲一個例子,後我批次兩個例子具有標籤序列[44, 45, 26, 45, 46, 44, 30, 44][5, 8, 17, 4, 18, 19, 14, 17, 12]分別我從評估(成批)SparseTensor得到以下結果:

SparseTensorValue(indices=array([[0, 0], 
     [0, 1], 
     [0, 2], 
     [0, 3], 
     [0, 4], 
     [0, 5], 
     [0, 6], 
     [0, 7], 
     [1, 0], 
     [1, 1], 
     [1, 2], 
     [1, 3], 
     [1, 4], 
     [1, 5], 
     [1, 6], 
     [1, 7], 
     [1, 8]]), values=array([44, 45, 26, 45, 46, 44, 30, 44, 5, 8, 17, 4, 18, 19, 14, 17, 12], dtype=int32), dense_shape=array([2, 9])) 

通知如何索引的行在稀疏張量值中對應於批號,並且列對應於該特定標籤的序列索引。這些值本身就是序列標籤類。等級是2,最後維度的大小(在這種情況下是9)是最長序列的長度。

+0

對於後期回覆感到抱歉,所以「t」只是特定標籤的順序,無論相應輸入序列的持續時間有多長? –

+0

我認爲是對的。但是,儘管模型每個輸入切片只能產生最多一個輸出,但您的標籤序列不應該長於輸入長度。 (使用標籤合併,它也可以生成_fewer_輸出,而不是輸入。) – Jerod