2017-08-02 79 views
0

我正在嘗試使用tensorflow(V.1.1.0)對輸出層中的單個神經元執行二進制分類。下面的代碼片段對應於我目前使用的損失函數和優化器(靈感來自答案here)。然而Tensorflow中的非平衡二元分類

ratio=.034 #minority/population ratio 
learning_rate=0.001 
class_weight=tf.constant([[ratio,1.0-ratio]],name='unbalanced_ratio') #weight vector, (lab_feed is one_hot labels) 
weight_per_label=tf.transpose(tf.matmul(lab_feed,tf.transpose(class_weight)),name='weights_per_label') 
xent=tf.multiply(weight_per_label,tf.nn.sigmoid_cross_entropy_with_logits(labels=lab_feed,logits=output),name='loss') 
loss=tf.reduce_mean(xent) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate,name='GradientDescent').minimize(loss) 

我的問題是,由於某種原因,所有實例被列爲時代的進展後同一類。我是否必須在中途停止訓練,或者是否有損失功能出現問題?

enter image description here

+0

我是否正確理解您的培訓混淆矩陣:1800個屬於0類的訓練樣本,只有130個屬於1類? – B1T0

+0

@ B1T0是的,這是正確的。 – mamafoku

+0

這是一個問題。你將不得不平衡你的數據集。有關該主題的互聯網上有很多信息。 [This](http://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/)是一個很好的介紹。 – Flomp

回答

0

您濫用乙狀結腸交叉熵就好像它是SOFTMAX交叉熵。

乙狀結腸交叉熵適應二元分類 - 你的問題是二元分類,所以這很好。但是,網絡的輸出應該只有一個通道每個二進制分類任務 - 在你的情況下,你有一個單一的二進制分類任務,所以你的網應該只有一個輸出通道。

要平衡S形交叉熵,您需要平衡交叉熵的每個單獨部分,即來自正值的部分和來自負值的部分。這不能在輸出上完成,因爲輸出已經是正面和負面部分的總和。

希望在tensorflow中有一個函數來做到這一點,tf.nn.weighted_cross_entropy_with_logits。其用法類似於tf.nn.sigmoid_cross_entropy,其中附加參數對應於正類的權重。

你目前在做什麼,是在兩個不同的通道上有兩個二進制分類器,並且只發送負樣本到第一個樣本和正樣本到第二個。這不能產生有用的東西。