检查标签
问题描述:
考虑这个问题,我有一个输出矢量如下所示:检查标签
[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并计算损失。
答
由于可能有人反驳我犯同样的错误,这里是解决方案。我想在损失计算过程中检查标签,因为有很多配对标签需要很长时间才能通过单独的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)
答
输入数据的选择取决于您的问题,而不是技术解决方案的细节。
- 要么没有标签的数据是你在测试时不会遇到的东西。那么你应该简单地从数据集中删除数据。然而,你没有的事实可能是一个你不能这样做的标志,因为这些数据属于那里。
- 或者,如果这些数据是您在测试时遇到并需要处理的内容,则需要保留并学习。例如,您可以添加第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)
感谢您的答复,但我不能改变输入数据格式,或忽略一些标签,可以考虑我的问题是这样的:以高分辨率图像的一半作为输入,并预测另一半,逐像素,所以我想预测每个像素,并且一些像素将是空的,因此相关的单热标签没有1这种情况 –
我在说的是,你可以动态地添加第85列到你的输入标签。 – user1735003
当然,我可以做到这一点,但它没有任何意义,我想通过忽略不计算损失(不计算损失)的计算来减少计算的复杂性,但通过添加第85列,我仍然有相同的计算复杂度 –