阅读TensorFlow 2.0的文档后,我发现:
tf.keras.losses.sparse_categorical_crossentropy
和
tf.keras.losses.SparseCategoricalCrossentropy
在教程中使用它们的方式,它们的论据,它们的描述,它们似乎和我一样。两者有什么区别?
答案 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())
注意类版本上的多余括号,您需要传入一个类的实例。