计算损失时检查标签(tensorflow)

时间:2017-04-17 22:20:15

标签: python tensorflow neural-network deep-learning

考虑这个问题,我有一个像这样的输出向量:

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

和目标标签如下:

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

输出和目标标签是3乘3表示特定标签(即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除以84 (5,443,200 / 64,800 = 84)并将它们分配给softmax,然后连续计算并计算损失。

2 个答案:

答案 0 :(得分:1)

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

  1. 没有标签的数据是您在测试时不会遇到的。然后,您应该只是从数据集中删除数据。但是,你没有这样做的事实可能是你无法做到的,因为这些数据属于那里。
  2. 或者,如果这些数据是您将遇到并需要在测试时处理的数据,您需要保留它并在其上学习。例如,您可以添加第85个标签,如果84个其他标签为零,则为1,否则为零。
  3. 修改

    扩充标签的示例:

    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)
    

答案 1 :(得分: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)