使用 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 存在,未知是未超过阈值的任何值。
您正在尝试获取一个标量值来表示两个维度:属性的存在和预测的置信度。
我正在构建一个预测图像的 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,您可以根据最高概率结果
定义预测哪个 classy_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 存在,未知是未超过阈值的任何值。
您正在尝试获取一个标量值来表示两个维度:属性的存在和预测的置信度。