理解tensorflow sequence_loss参数

时间:2016-12-14 03:55:21

标签: tensorflow

sequence_Loss模块的source_code有三个参数,需要将它们列为输出,目标和权重。

输出和目标是不言自明的,但我希望更好地理解weight参数是什么?

我觉得另一件令人困惑的事情是,它指出targets应该与输出相同length,它们究竟是什么意思是张量的长度?特别是如果它是一个三维张量。

2 个答案:

答案 0 :(得分:3)

将权重视为应用于输入张量的掩码。在一些NLP应用程序中,我们每个句子的句子长度通常不同。为了将多个实例句子并行/批量化为小批量以馈入神经网络,人们使用掩码矩阵来表示输入张量中的哪个元素实际上是有效输入。例如,权重可以是np.ones([batch, max_length]),这意味着所有输入元素都是合法的。

我们也可以使用与np.asarray([[1,1,1,0],[1,1,0,0],[1,1,1,1]])等标签形状相同的矩阵(我们假设标签形状为3x4),然后第一行最后一列的crossEntropy将被屏蔽为0。 / p>

您还可以使用权重来计算交叉熵的加权累积。

答案 1 :(得分:1)

我们在课堂上使用了这个,我们的教授说我们可以把它传递给正确的形状(评论说" 1D批量大小的浮点数 - 与logits相同长度的张量") 。这对他们的意思没有帮助,但也许它可以帮助您运行代码。为我工作。

这段代码可以解决问题:[tf.ones(batch_size, tf.float32) for _ in logits]

编辑:来自TF代码:

for logit, target, weight in zip(logits, targets, weights):
      if softmax_loss_function is None:
        # TODO(irving,ebrevdo): This reshape is needed because
        # sequence_loss_by_example is called with scalars sometimes, which
        # violates our general scalar strictness policy.
        target = array_ops.reshape(target, [-1])
        crossent = nn_ops.sparse_softmax_cross_entropy_with_logits(
            logit, target)
      else:
        crossent = softmax_loss_function(logit, target)
      log_perp_list.append(crossent * weight)

传递的权重乘以该特定logit的损失。所以我想如果你想特别认真地对待一个特定的预测,你可以将重量增加到1以上。