考虑这个问题,我有一个像这样的输出向量:
[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,然后连续计算并计算损失。
答案 0 :(得分: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 :(得分: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)