是否可以在label_smoothing中使用来自tf.losses.softmax_cross_entropy的tf.contrib.seq2seq.sequence_loss特性?
我可以看到,sequence_loss可以选择以一个softmax_loss_function作为参数。然而,这个函数将把targets作为in的列表,而不是tf.losses.softmax_cross_entropy所要求的一个热编码向量,这也是TensorFlow中唯一支持label_smoothing的函数。
您能推荐一种使label_smoothing与sequence_loss协同工作的方法吗?
发布于 2018-03-06 19:01:34
这是不可能有效完成的。
tf.contrib.seq2seq.sequence_loss被设计用于处理非常大的词汇表,因此它希望从稀疏家族中获得一个丢失函数(详见this question )。主要的区别是标签使用序号编码,而不是单一热编码,因为后者占用了太多的内存。实际的一次热编码是,从未计算过.
另一方面,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都没有提供类似的参数。当然,您可以自己进行转换,但这会破坏整个优化。
https://stackoverflow.com/questions/49136472
复制相似问题