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

Attribute prediction with CNN and cross entropy loss (negative values for absent attributes)

我正在构建一个预测图像的 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 函数来只有正损失?

所以为了清楚起见,您应该看到 classifier 的结果是三个节点,无论结果是什么。它们是 (y0,y1,y2),然后通过对这些结果应用 softmax,您将得到一个新值,表示概率范围在 0 到 1

之间的答案

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

p_y_given_x = softmax(y_given_x)

然后通过应用 argmax,您可以根据最高概率结果

定义预测哪个 class
y_prediction = argmax(p_y_given_x)

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

现在你应该做的是根据你的数据属性取预测的class个数。

但首先让我们就一件事达成一致

  • 现在:class 0
  • 不存在:class 1
  • 未知:class 2

假设您的对象不在图像中,因此您应该获取第二个对象的值并应用 logliklihood

-log(p_y_given_x[y]) 

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

考虑将范围更改为 [0, 1],接近 0 表示不存在,接近 1 存在,未知是未超过阈值的任何值。

您正在尝试获取一个标量值来表示两个维度:属性的存在和预测的置信度。