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?

3
Leevo 16 grudzień 2019, 19:07

2 odpowiedzi

Najlepsza odpowiedź

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.

1
Burton2000 16 grudzień 2019, 19:26
1
Proszę popraw mnie jeżeli się mylę. Myślę, że można zdefiniować obiekt, na przykład: loss = SparseCategoricalCrossentropy(), ale z drugiej strony musisz użyć sparse_categorical_crossentropy tak, jak jest, prawda?
 – 
Leevo
16 grudzień 2019, 19:36
1
To jest poprawne. Uważam, że dokładniej, istnieje pewien interfejs, który ma metoda kompilacji, więc oczekuje, że „strata” będzie obiektem wywoływanym, który przyjmuje 2 parametry (logity i etykiety).
 – 
Burton2000
16 grudzień 2019, 19:38

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

1
Nicolas Gervais 16 grudzień 2019, 19:21