1

我試圖用TensorFlow實現多標籤分類(即每個輸出模式可以有許多活動單位)。該問題具有不平衡的類(即,比標籤分佈中的零多得多,這使得標籤模式非常稀疏)。Tensorflow加權與S形交叉熵損失

解決此問題的最佳方法應該是使用tf.nn.weighted_cross_entropy_with_logits函數。但是,我得到這個運行時錯誤:

ValueError: Tensor conversion requested dtype uint8 for Tensor with dtype float32 

我不明白這裏有什麼問題。由於輸入損失函數,我通過標籤張量,該張量logits,陽性類權重,這是一個常數:

positive_class_weight = 10 
loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight) 

有關如何解決這個任何提示?如果我只是將相同的標籤和logits張量傳遞給tf.losses.sigmoid_cross_entropy損失函數,那麼一切正常(從Tensorflow正常運行的意義上講,但當然,訓練後的預測始終爲零)。

查看相關問題here

回答

1

的錯誤很可能會喪失功能後,被拋出,因爲tf.losses.sigmoid_cross_entropytf.nn.weighted_cross_entropy_with_logits之間的唯一顯著差異是返回張的形狀。

看看這個例子:

logits = tf.linspace(-3., 5., 10) 
labels = tf.fill([10,], 1.) 

positive_class_weight = 10 
weighted_loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight) 
print(weighted_loss.shape) 

sigmoid_loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels, logits=logits) 
print(sigmoid_loss.shape) 

張量logitslabels是一種人爲的,都具有形狀(10,)。但重要的是weighted_losssigmoid_loss是不同的。下面是輸出:

(10,) 
() 

這是因爲tf.losses.sigmoid_cross_entropy進行縮小(默認的總和)。所以爲了複製它,你必須用tf.reduce_sum(...)來包裝加權損失。

如果這沒有幫助,請確保labels張量的類型爲float32。此錯誤是很容易做,例如,下面的聲明將無法工作:

labels = tf.fill([10,], 1) # the type is not float! 

您可能也有興趣閱讀this question

+0

非常感謝,解決了這個問題。我不得不明確地將標籤轉換爲'float32',並使用'tf.reduce_sum(...)'來減少丟失輸出。 – Alberto