蒙面张量的损失

时间:2017-06-06 06:37:50

标签: python tensorflow machine-learning nlp

假设我有像

这样的记录
[[4.3, -0.5, -2.7, 0, 0],
[0.5, 2.3, 0, 0, 0]]

其中显然第一个示例中的最后两个和第二个示例中的后三个被屏蔽(即它们为零),并且不应影响丢失和梯度计算。

如何计算此logits与相应标签之间的交叉熵损失?为了理智,此示例的标签可能类似于

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

(一个问题:Softmax,后跟log,logit也适用于蒙版零点,而且tf的交叉熵方法也会考虑这些元素的损失。)

(另外,你可以考虑这样的问题:我在批处理中有不同长度的logits,即我的logits分别为eg.1和eg.2的长度为3和2。相同后面是标签。 )

4 个答案:

答案 0 :(得分:2)

我最终要做的事情如下:

import tensorflow as tf
import numpy as np
prelim_scores=tf.constant([[4.3, -0.5, -2.7, 0, 0],[0.5, 2.3, 0, 0, 0]])
mask=tf.constant([[True,True,True,False,False],[True,True,False,False,False]])
dummy_scores = tf.ones_like(prelim_scores) * -99999.0  # the base matrix to choose from if dummy relation
scores = tf.where(mask, prelim_scores,dummy_scores)  # [B, MAX_NUM_ACTIONS]
a=tf.nn.softmax(scores)
with tf.Session() as sess:
   print(sess.run(a))

结果是:

[[9.99.9123e-01 8.1551941e-03 9.0362143e-04 0 0]

[1.4185105e-01 8.5814887e-01 0 0 0]]

贷方转到:here

答案 1 :(得分:2)

使交叉熵损失是库中涵盖的常见操作。实际上,它处理权重的更一般概念。提供用于屏蔽的二进制权重。

mask = tf.equal(logits, 0) # as in the OP
weights = tf.to_float(mask) # convert to (0, 1) weights
loss = tf.losses.softmax_cross_entropy(labels, logits, weights)

不要通过先计算输出的softmax然后再计算交叉熵来计算softmax交叉熵,而会同时失去计算精度和稳定性。

答案 2 :(得分:0)

您可以这样做:

import tensorflow as tf
logits = [[4.3, -0.5, -2.7, 0, 0], [0.5, 2.3, 0, 0, 0]]
labels = [[1, 0, 0, 0, 0], [0, 1, 0, 0, 0]]
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=labels))

答案 3 :(得分:0)

在这种情况下,使用TF2可以使用索引。 那就是我最终要做的。

mask = logits != 0 
weights = tf.cast(mask, tf.float32) 
labels = tf.cast(labels, tf.float32)
logits = tf.cast(logits, tf.float32)
tf.compat.v1.losses.softmax_cross_entropy(labels[mask], logits[mask])