Tensorflow,from_logits = True或False在Tensorflow的sparse_categorical_crossentropy中意味着什么?

时间:2019-03-21 23:26:35

标签: tensorflow loss-function cross-entropy

在Tensorflow 2.0中, 有一个损失函数叫做

tf.keras.losses.sparse_categorical_crossentropy(labels, targets, from_logits = False)

我可以问一下设置from_logits = True或False有什么区别? 我的猜测是,当传入值是logits时,您将from_logits设置为True,并且如果传入值是概率(由softmax等输出),则只需将from_logits = False(这是默认设置)设置即可。

但是为什么呢?损失只是一些计算。为什么需要根据输入值来区别? 我也在Google的Tensorflow教程中看到了 https://www.tensorflow.org/alpha/tutorials/sequences/text_generation 即使最后一层的传入值为logits,也不会设置from_logits = True。 这是代码

@tf.function
def train_step(inp, target):
  with tf.GradientTape() as tape:
    predictions = model(inp)
    loss = tf.reduce_mean(
        tf.keras.losses.sparse_categorical_crossentropy(target, predictions))
  grads = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(grads, model.trainable_variables))

  return loss

模型所在的地方

 model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim, 
                              batch_input_shape=[batch_size, None]),
    tf.keras.layers.LSTM(rnn_units, 
                        return_sequences=True, 
                        stateful=True, 
                        recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(vocab_size)
  ])

没有softmax的最后一层。 (此外,在本教程的另一部分中,它设置from_logits = True)

那么,我是否将其设置为True都没关系吗?

1 个答案:

答案 0 :(得分:4)

Deepak提到的帖子具有一定的数学背景。

但是为了简单起见,from_logits = True表示crossEntropy层的输入是正常张量/ logits,而如果from_logits = False,则表示输入是一个概率,通常您应该在最后一层中有一些softmax激活。