TensorFlow 2.0:sparse_categorical_crossentropy和SparseCategoricalCrossentropy有什么区别?

时间:2019-12-16 16:07:50

标签: python tensorflow keras tensorflow2.0

阅读TensorFlow 2.0的文档后,我发现:

tf.keras.losses.sparse_categorical_crossentropy

tf.keras.losses.SparseCategoricalCrossentropy

在教程中使用它们的方式,它们的论据,它们的描述,它们似乎和我一样。两者有什么区别?

2 个答案:

答案 0 :(得分:1)

没有。如果您查看链接的文档,则可以在GitHub上找到源代码。两者都指向同一个对象:

def sparse_categorical_crossentropy(target, output, from_logits=False, axis=-1):
  """Categorical crossentropy with integer targets.

  if not from_logits:
    if (isinstance(output, (ops.EagerTensor, variables_module.Variable)) or
        output.op.type != 'Softmax'):
      epsilon_ = _constant_to_tensor(epsilon(), output.dtype.base_dtype)
      output = clip_ops.clip_by_value(output, epsilon_, 1 - epsilon_)
      output = math_ops.log(output)
      # ... blablabla

其中所在:

tensorflow/python/keras/backend.py

例如,前者(tf.keras.losses.sparse_categorical_crossentropy)的命名如下:

def sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1):
  return K.sparse_categorical_crossentropy(
      y_true, y_pred, from_logits=from_logits, axis=axis)

因此它指向tensorflow/python/keras/backend.py

中的另一个

答案 1 :(得分:1)

一个是函数,一个是类。

第一个是功能版本,评估时它只会吐出损失的值。

第二个是类版本。您需要评估类本身的实例以获得损失值。

我相信您是对的,几乎没有什么区别,如果使用keras api,则唯一的区别就是编译模型时。

例如

model.compile(loss=tf.keras.losses.sparse_categorical_crossentropy)

vs

model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy())

注意类版本上的多余括号,您需要传入一个类的实例。