Czytając dokumentację TensorFlow 2.0, znalazłem:
tf.keras.losses.sparse_categorical_crossentropy
I
tf.keras.losses.SparseCategoricalCrossentropy
Sposób, w jaki są używane w tutorialach, ich argumenty, opisy wydają mi się równe. Jaka jest różnica między nimi?
2 odpowiedzi
Jeden to funkcja, a drugi to klasa.
Pierwsza to wersja funkcjonalna, po prostu wypluje wartość straty podczas jej oceny.
Druga to wersja klasowa. Musisz ocenić instancję samej klasy, aby uzyskać wartość straty.
Uważam, że masz rację, że jest niewielka różnica, jeśli używasz interfejsu API keras, jedyna różnica będzie występować podczas kompilacji modelu.
Na przykład
model.compile(loss=tf.keras.losses.sparse_categorical_crossentropy)
vs
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy())
Zwróć uwagę na dodatkowe nawiasy w wersji klasy, potrzebujesz wystąpienia klasy do przekazania.
Nie ma żadnego. Jeśli spojrzysz na powiązaną dokumentację, możesz dostać się do kodu źródłowego na GitHub. Oba wskazują na ten sam obiekt:
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
Która jest w:
tensorflow/python/keras/backend.py
Na przykład pierwszy (tf.keras.losses.sparse_categorical_crossentropy
) nazywa się tak:
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)
Więc wskazuje na drugą w tensorflow/python/keras/backend.py
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.
loss = SparseCategoricalCrossentropy()
, ale z drugiej strony musisz użyćsparse_categorical_crossentropy
tak, jak jest, prawda?