我正在构建一个用于预测图像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之间的概率范围表示答案
假设你得到的结果是这种形式[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,并通过这种方式反向传播错误来惩罚系统。