2017-04-17 75 views
1

考虑这个问题,我有一个输出矢量如下所示:检查标签

[0.1, 0.3, 0.6, 0.4, 0.1, 0.5, 0.6 , . . .]

和目标标签这样的:

[ 0 , 0 , 1 , 0 , 0 , 1 , 1 , . . .]

输出并且目标标签是三乘三表示特定标签(即,logits [0.1, 0.3, 0.6]和相关目标标签[0, 0, 1]),

在原来的问题其实不是3,但84和标签和输出矢量的长度非常大(约500万),并在大多数情况下(约90%)相关标签没有1,所以没有需要计算该输出的损失,

现在我的问题是,如何忽略那些在相关标签中没有1的输出?

或换句话说如何在培训期间检查标签以计算损失?

有我的损失函数:

score_split = tf.split(1, 64800, scores) 
score_split_output = [tf.nn.softmax(c) for c in score_split] 
output = tf.concat(1, score_split_output) 
total_loss = tf.reduce_mean(-tf.reduce_sum(labels * tf.log(output), [1])) 

我84 (5,443,200/64,800 = 84)得分除以84,并给他们使用SoftMax,然后CONCAT并计算损失。

回答

0

由于可能有人反驳我犯同样的错误,这里是解决方案。我想在损失计算过程中检查标签,因为有很多配对标签需要很长时间才能通过单独的Softmax功能计算每个标签。

然后我重塑logits和标签的载体为[-1, 3],并把它们应用一个SOFTMAX:

logits = tf.reshape(self.score, [-1, 3]) 
    labels = tf.reshape(self.y, [-1, 3]) 
    loss = tf.nn.softmax_cross_entropy_with_logits(logits, labels) 
1

输入数据的选择取决于您的问题,而不是技术解决方案的细节。

  1. 要么没有标签的数据是你在测试时不会遇到的东西。那么你应该简单地从数据集中删除数据。然而,你没有的事实可能是一个你不能这样做的标志,因为这些数据属于那里。
  2. 或者,如果这些数据是您在测试时遇到并需要处理的内容,则需要保留并学习。例如,您可以添加第85个标签,如果其他84个标签为零,则为1,否则为零。

编辑增强您的标签的

例子:

import tensorflow as tf 
labels = tf.zeros((100, 84)) 
label85 = 1-tf.reduce_max(labels) 
new_labels = tf.concat([labels, tf.expand_dims(label85,-1)], 0) 
+0

感谢您的答复,但我不能改变输入数据格式,或忽略一些标签,可以考虑我的问题是这样的:以高分辨率图像的一半作为输入,并预测另一半,逐像素,所以我想预测每个像素,并且一些像素将是空的,因此相关的单热标签没有1这种情况 –

+0

我在说的是,你可以动态地添加第85列到你的输入标签。 – user1735003

+0

当然,我可以做到这一点,但它没有任何意义,我想通过忽略不计算损失(不计算损失)的计算来减少计算的复杂性,但通过添加第85列,我仍然有相同的计算复杂度 –