张量流中的不平衡二进制分类

时间:2017-08-02 12:58:31

标签: python tensorflow classification

我正在尝试使用tensorflow(V.1.1.0)在输出层使用单个神经元执行二进制分类。下面的代码段对应于我目前使用的损失函数和优化器(灵感来自答案here)。

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

1 个答案:

答案 0 :(得分:0)

你正在滥用sigmoid交叉熵,好像它是softmax交叉熵。

Sigmoid交叉熵适用于二元分类 - 你的问题是二元分类,所以没关系。但是,你的网络输出每个二进制分类任务应该只有一个通道 - 在你的情况下,你有一个二进制分类任务,所以你的网络应该只有一个输出通道。

为了平衡S形交叉熵,您需要平衡交叉熵的每个部分,即来自正面的部分和来自负面的部分。这不能像你一样在输出上完成,因为输出已经是正面和负面部分的总和。

希望tensorflow中有一个函数可以做到这一点tf.nn.weighted_cross_entropy_with_logits。它的用法类似于tf.nn.sigmoid_cross_entropy,其附加参数对应于正类的权重。

您目前正在做的是,在两个不同的通道上有两个二进制分类器,并且只将负样本发送到第一个,将正样本发送到第二个。这不能产生有用的东西。