我有一個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))
我認爲我們應該用張寫操作損失函數,但是,我不熟悉它們。所以任何人都可以給我一些關於如何定義損失函數的建議。
謝謝你的答覆或建議。
我發現了一些tensorflow函數來處理張量,如tf.cond(),tf.boolen_mask和tf.gather()。但我不知道如何使用它們。在我們的情況下,關鍵問題是如何根據由0或1組成的對應於增強和非增強的augs張量來對數據和標籤張量進行切片。那麼有人可以給我一個建議嗎?非常感謝你。 – Kongsea