sequence_Loss
模块的source_code有三个参数,需要将它们列为输出,目标和权重。
输出和目标是不言自明的,但我希望更好地理解weight
参数是什么?
我觉得另一件令人困惑的事情是,它指出targets
应该与输出相同length
,它们究竟是什么意思是张量的长度?特别是如果它是一个三维张量。
答案 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以上。