簡體   English   中英

Tensorflow2.0 模型訓練的 CTC_Loss

[英]CTC_Loss for Model training in Tensorflow2.0

我正在做一個項目,我們必須使用 ctc_batch_cost 來計算損失。 我定義了返回 CTC 損失的函數並嘗試在 'model.compile' 語句中使用它。 但是在這里,我不知道如何獲得“y_pred”。 有人可以幫我修復這個“model.compile”語句嗎?

CTC損失函數

    def ctc_loss_func(args):
       y_pred, labels, input_length, label_length = args
       return K.ctc_batch_cost(labels, y_pred, input_length, label_length)

根據這里的tensorflow 文檔,我們需要提供 ['y_true','y_pred','input_length','label_length']。我的數據幀有 10000 個數據點,我的模型有一個輸出層為model.add(Dense(78, activation='softmax'))

所以我創建了一個包含 10000 個元素的 78s 列表作為 input_length input_length = [78]*10000

我將原始單詞的長度放入 label_length 如下:

    label_length = []
    for item in y.iteritems():
       tex = item[1]
       l = len(tex)
       label_length.append(l)

我已將樣本中的每個單詞編碼為 78 個字符的向量,並創建了一個大小為 (10000,78) 的數組。 我將其作為 y_true 傳遞

但是如何在編譯模型之前獲得“y_pred”? 我應該首先使用其他一些損失函數(如“categorical_cross_entropy”)編譯和訓練模型以獲得 y_pred 嗎? 如果是,那是否意味着我必須兩次編譯和訓練我的模型。 首先使用“categorical_cross_entropy”,然后使用“ctc_loss”

編譯模型

    model.compile(loss=ctc_loss_func(y_true,y_pred,input_length,label_length), optimizer='adam', metrics=['acc'])

損失函數應該只接受y_truey_pred 例如:

def foo(y_true, y_pred):
    loss = abs(y_true - y_pred) # or other logic
    return loss

所以你通常不能將四個值傳遞給損失函數。 您有多種選擇來解決此問題。

  1. 如果你不關心長度,你可以為ctc_batch_cost編寫一個包裝器,或者它們是常量並將它們硬編碼為常量或將它們作為張量的維度:

     def ctc_loss(y_true, y_pred): batch_size = tf.shape(y_true)[0] input_length = tf.shape(y_pred)[1] label_length = tf.shape(y_true)[1] input_length = input_length * tf.ones(shape=(batch_size, 1), dtype="int64") label_length = label_length * tf.ones(shape=(batch_size, 1), dtype="int64") loss = K.ctc_batch_cost(y_true,y_pred,input_length,label_length) return loss # Now you can compile model model.compile(loss=ctc_loss, optimizer='adam', metrics=['acc'])
  2. 您可以將有關input_length信息連接到您的y_true並在ctc_loss函數中提取它:

     def ctc_loss(y_true, y_pred): batch_size = tf.shape(y_true)[0] input_length = tf.shape(y_pred)[1] label_length = y_true[:,-1:] y_true = y_true[:,:-1] input_length = input_length * tf.ones(shape=(batch_size, 1), dtype="int64") label_length = label_length * tf.ones(shape=(batch_size, 1), dtype="int64") loss = K.ctc_batch_cost(y_true,y_pred,input_length,label_length) return loss
  3. 您可以編寫自定義 keras 層將計算放在那里並通過self.addloss(calculated_ctc_loss)添加損失

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM