使用CNN和交叉熵损失进行属性预测(缺失属性使用负值)

我正在构建一个用于预测图像100个属性的神经网络(CNN)。训练数据如下-

image_name image_attributes

img/img001.jpg -1, 1, -1 , 1, 0 .......-1 , 1

因此,存在的属性值为1,如果该属性不存在则为-1,如果未知则为0。我使用Tensorflow并定义我的损失函数如下-

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))

我的问题是,如果我最小化这个损失,有时由于-1表示某些属性的缺失,损失会出现负值,我的优化算法会进一步最小化这个已经是负值的损失。这不是一种发散吗?

最小化这个损失是否正确,还是应该使用mod函数来确保只有正损失?


回答:

为了清楚起见,你应该将分类器的输出视为三个节点,每个节点的结果各不相同,它们是(y0,y1,y2),然后通过对这些结果应用softmax,你将获得新的值,这些值以0到1之间的概率范围表示答案

enter image description here

假设你得到的结果是这种形式[1,−2,0],通过应用softmax,你将得到[0.7,0.04,0.26]

p_y_given_x = softmax(y_given_x)

然后通过应用argmax,你可以根据最高概率结果定义哪个类别被预测

y_prediction = argmax(p_y_given_x)

这意味着在我们的例子中是[1,0,0]

现在你应该做的是根据你的数据属性选择预测类别的编号。

但首先我们要达成共识

  • 存在:类别0
  • 不存在:类别1
  • 未知:类别2

假设你的对象在图像中不存在,那么你应该取第二个对象的值并应用对数似然

-log(p_y_given_x[y]) 

这是第二个值0.04,并通过这种方式反向传播错误来惩罚系统。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注