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

Python 计算损失时检查标签(tensorflow),python,tensorflow,neural-network,deep-learning,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,…] 输出和目标标签是三乘三表示一个特定标签(即logits[0.1,0.3,0.6]和相关目标标签[0,0,1]) 在最初的问题中,实际上不是3,而是84,标签和输出向量的长度非常大(约500万),在大多数情况下(约90%),相关标签没有1,因此无需计算该输出的损失 现在我的问题是,我怎么能忽略在相关标签中没有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除以84
(5443200/64800=84)
并将其交给softmax,然后计算损失。

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

  • 您在测试时不会遇到没有标签的数据。然后,您只需从数据集中删除数据。然而,您没有这样做的事实可能表明您不能这样做,因为这些数据属于那里
  • 或者,如果这些数据是您将遇到并需要在测试时处理的,那么您需要保留这些数据并从中学习。例如,您可以添加第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)
    

    也许有人会反驳我犯的同样的错误,下面是解决办法。我想在损失计算期间检查标签,因为有很多成对的标签,通过单独的Softmax函数计算每个标签需要很长时间

    然后,我将logits和label向量重塑为
    [-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在这种情况下,我要说的是,你可以动态地向你的输入标签添加第85列。我明白了,当然,我可以这样做,但这没有意义,我想通过忽略(不计算损失)没有1的标签来降低计算的复杂性,但是通过添加第85列,我仍然会有同样的计算复杂性好吧,但是为什么你不能从你的输入中删除它们呢?在测试时会发生什么?因为它们不是独立的数据,考虑一个图像,它在中间有一个对象,周围有很多空的空间(对于空的像素有标签零),但是其他图像在中间可能有空的空间和角落中的对象。