是否可以将tf.losses.softmax_cross_entropy
中的label_smoothing
功能与tf.contrib.seq2seq.sequence_loss
一起使用?
我可以看到sequence_loss
可以选择将softmax_loss_function
作为参数。然而,这个函数会将targets
作为整数列表,而不是tf.losses.softmax_cross_entropy
所需的独热编码向量,这也是 TensorFlow 中唯一支持 label_smoothing
的函数。
你能推荐一种让label_smoothing与sequence_loss
一起工作的方法吗?
这不能有效地完成。
tf.contrib.seq2seq.sequence_loss
被设计为处理非常大的词汇表,因此它期望来自稀疏族的损失函数(有关详细信息,请参阅此问题(。主要区别在于标签使用序号编码而不是 one-hot,因为后者占用太多内存。从不计算实际的独热编码。
另一方面label_smoothing
tf.losses.softmax_cross_entropy
参数是操作独热编码的选项。以下是它的作用:
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
都没有提供类似的参数。当然,您可以自己进行转换,但这会破坏整个优化。