2

是否可以使用with的label_smoothing功能?tf.losses.softmax_cross_entropytf.contrib.seq2seq.sequence_loss

我可以看到它sequence_loss可以选择softmax_loss_function作为参数。但是,此函数将targetst 作为整数列表,而不是 所需的 one-hot 编码向量tf.losses.softmax_cross_entropy,这也是label_smoothingTensorFlow 中唯一支持的函数。

你能推荐一种使 label_smoothing 工作的方法sequence_loss吗?

4

1 回答 1

3

这不能有效地完成。

tf.contrib.seq2seq.sequence_loss旨在处理非常大的词汇表,因此它期望来自稀疏家族的损失函数(有关详细信息,请参阅此问题)。主要区别在于标签使用序数编码而不是one-hot,因为后者占用了太多内存。从不计算实际的 one-hot 编码。

label_smoothingtf.losses.softmax_cross_entropy另一方面,参数 of是操纵 one-hot 编码的选项。这是它的作用:

if label_smoothing > 0:
  num_classes = math_ops.cast(
      array_ops.shape(onehot_labels)[1], logits.dtype)
  smooth_positives = 1.0 - label_smoothing
  smooth_negatives = label_smoothing / num_classes
  onehot_labels = onehot_labels * smooth_positives + smooth_negatives

如您所见,要计算此张量,onehot_labels必须显式存储,这正是稀疏函数试图避免的。这就是为什么既不提供tf.nn.sparse_softmax_cross_entropy_with_logits,也不tf.contrib.seq2seq.sequence_loss提供类似参数的原因。当然,您可以自己进行转换,但这会破坏整个优化。

于 2018-03-06T19:01:34.633 回答