2016-09-18 269 views
1

我有一個train_data和train_labels的訓練數據集,它是tensorflow圖中的train_data_node和train_labels_node。 如你所知,我可以使用tensorflow的損失函數爲波紋管:如何在TensorFlow中定義加權損失函數?

logits = model(train_data_node) 
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
    logits,train_labels_node)) 

然而,這種損失函數同樣處理所有的訓練數據。 但是在我們的情況下,我們想要有區別地處理數據。例如,我們有一個對應於訓練數據的csv文件,用於指示列車數據是原始數據還是增加數據。 然後我們要定義一個自定義的損失函數,這使得原始數據的丟失發揮更重要的作用,並增強數據發揮不太重要的作用,如損失:

loss_no_aug = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(noAugLogits, noAugLabels)) 
loss_aug = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels)) 
loss = loss_no_aug * PENALTY_COEFFICIENT + loss_aug 

我已經定義了一個損失函數爲波紋管,但它沒有工作:

def calLoss(logits, labels, augs): 
    noAugLogits = [] 
    noAugLabels = [] 
    augLogits = [] 
    augLabels = [] 
    tf.get_collection() 
    for i in range(augs.shape[0]): 
    if augs[i] == 1: 
     noAugLogits.append(logits[i]) 
     noAugLabels.append(labels[i]) 
    else: 
     augLogits.append(logits[i]) 
     augLabels.append(labels[i]) 
    noAugLogits = tf.convert_to_tensor(noAugLogits) 
    noAugLabels = tf.convert_to_tensor(noAugLabels) 
    augLogits = tf.convert_to_tensor(augLogits) 
    augLabels = tf.convert_to_tensor(augLabels) 
    return tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
     noAugLogits, noAugLabels)) * PENALTY_COEFFICIENT + \ 
     tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels)) 

我認爲我們應該用張寫操作損失函數,但是,我不熟悉它們。所以任何人都可以給我一些關於如何定義損失函數的建議。

謝謝你的答覆或建議。

+0

我發現了一些tensorflow函數來處理張量,如tf.cond(),tf.boolen_mask和tf.gather()。但我不知道如何使用它們。在我們的情況下,關鍵問題是如何根據由0或1組成的對應於增強和非增強的augs張量來對數據和標籤張量進行切片。那麼有人可以給我一個建議嗎?非常感謝你。 – Kongsea

回答

0

我終於通過使用tensorflow函數tf.boolen_mask()自己解決了這個問題。所定義的自定義加權損失函數爲波紋管:

def calLoss(logits, labels, augs): 
    augSum = tf.reduce_sum(augs) 
    pred = tf.less(augSum, BATCH_SIZE) 

    def noaug(logits, labels, augs): 
    augs = tf.cast(augs, tf.bool) 
    noaugs = tf.logical_not(augs) 
    noAugLogits = tf.boolean_mask(logits, noaugs) 
    noAugLabels = tf.boolean_mask(labels, noaugs) 
    augLogits = tf.boolean_mask(logits, augs) 
    augLabels = tf.boolean_mask(labels, augs) 
    noaugLoss = tf.reduce_mean(
     tf.nn.sparse_softmax_cross_entropy_with_logits(noAugLogits, noAugLabels)) 
    augLoss = tf.reduce_mean(
     tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels)) 
    return noaugLoss * PENALTY_COEFFICIENT + augLoss 

    def aug(logits, labels): 
    return tf.reduce_mean(
     tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)) 

    return tf.cond(pred, lambda: noaug(logits, labels, augs), lambda: aug(logits, labels)) 

正如你可以看到,我使用numpy的數組變量,的AUG,在對應的位置,使用1和0以指示在一批樣品的樣品是否被增大或非增強。然後,我將該變量轉換爲布爾張量,並將其用作tf.boolen_mask()的布爾掩碼來分別提取增強樣本和非增量樣本並計算損失。