2017-04-17 121 views
1

考慮這個問題,我有一個輸出矢量如下所示:檢查標籤

[0.1, 0.3, 0.6, 0.4, 0.1, 0.5, 0.6 , . . .]

和目標標籤這樣的:

[ 0 , 0 , 1 , 0 , 0 , 1 , 1 , . . .]

輸出並且目標標籤是三乘三表示特定標籤(即,logits [0.1, 0.3, 0.6]和相關目標標籤[0, 0, 1]),

在原來的問題其實不是3,但84和標籤和輸出矢量的長度非常大(約500萬),並在大多數情況下(約90%)相關標籤沒有1,所以沒有需要計算該輸出的損失,

現在我的問題是,如何忽略那些在相關標籤中沒有1的輸出?

或換句話說如何在培訓期間檢查標籤以計算損失?

有我的損失函數:

score_split = tf.split(1, 64800, scores) 
score_split_output = [tf.nn.softmax(c) for c in score_split] 
output = tf.concat(1, score_split_output) 
total_loss = tf.reduce_mean(-tf.reduce_sum(labels * tf.log(output), [1])) 

我84 (5,443,200/64,800 = 84)得分除以84,並給他們使用SoftMax,然後CONCAT並計算損失。

回答

0

由於可能有人反駁我犯同樣的錯誤,這裏是解決方案。我想在損失計算過程中檢查標籤,因爲有很多配對標籤需要很長時間才能通過單獨的Softmax功能計算每個標籤。

然後我重塑logits和標籤的載體爲[-1, 3],並把它們應用一個SOFTMAX:

logits = tf.reshape(self.score, [-1, 3]) 
    labels = tf.reshape(self.y, [-1, 3]) 
    loss = tf.nn.softmax_cross_entropy_with_logits(logits, labels) 
1

輸入數據的選擇取決於您的問題,而不是技術解決方案的細節。

  1. 要麼沒有標籤的數據是你在測試時不會遇到的東西。那麼你應該簡單地從數據集中刪除數據。然而,你沒有的事實可能是一個你不能這樣做的標誌,因爲這些數據屬於那裏。
  2. 或者,如果這些數據是您在測試時遇到並需要處理的內容,則需要保留並學習。例如,您可以添加第85個標籤,如果其他84個標籤爲零,則爲1,否則爲零。

編輯增強您的標籤的

例子:

import tensorflow as tf 
labels = tf.zeros((100, 84)) 
label85 = 1-tf.reduce_max(labels) 
new_labels = tf.concat([labels, tf.expand_dims(label85,-1)], 0) 
+0

感謝您的答覆,但我不能改變輸入數據格式,或忽略一些標籤,可以考慮我的問題是這樣的:以高分辨率圖像的一半作爲輸入,並預測另一半,逐像素,所以我想預測每個像素,並且一些像素將是空的,因此相關的單熱標籤沒有1這種情況 –

+0

我在說的是,你可以動態地添加第85列到你的輸入標籤。 – user1735003

+0

當然,我可以做到這一點,但它沒有任何意義,我想通過忽略不計算損失(不計算損失)的計算來減少計算的複雜性,但通過添加第85列,我仍然有相同的計算複雜度 –