как исправить ошибку несоответствия формы при использовании sparse_categorical_crossentropy - PullRequest
0 голосов
/ 02 марта 2020

Мне было интересно, почему при вводе двух тензоров одинаковой точной формы и одинакового содержимого я получаю ошибку, возникающую при вызове функции потерь sparse_categorical_crossentropy. У меня есть следующий код:

labels = np.array([0,1,2])
logits = np.array([0,1,2])
tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)

, и я получаю следующую ошибку:

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/losses.py in sparse_categorical_crossentropy(y_true, y_pred, from_logits, axis)
    976 def sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1):
    977   return K.sparse_categorical_crossentropy(
--> 978       y_true, y_pred, from_logits=from_logits, axis=axis)
    979 
    980 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/backend.py in sparse_categorical_crossentropy(target, output, from_logits, axis)
   4574   else:
   4575     res = nn.sparse_softmax_cross_entropy_with_logits_v2(
-> 4576         labels=target, logits=output)
   4577 
   4578   if update_shape and output_rank >= 3:

/tensorflow-2.1.0/python3.6/tensorflow_core/python/ops/nn_ops.py in sparse_softmax_cross_entropy_with_logits_v2(labels, logits, name)
   3535   """
   3536   return sparse_softmax_cross_entropy_with_logits(
-> 3537       labels=labels, logits=logits, name=name)
   3538 
   3539 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/ops/nn_ops.py in sparse_softmax_cross_entropy_with_logits(_sentinel, labels, logits, name)
   3451                        "should equal the shape of logits except for the last "
   3452                        "dimension (received %s)." % (labels_static_shape,
-> 3453                                                      logits.get_shape()))
   3454     # Check if no reshapes are required.
   3455     if logits.get_shape().ndims == 2:

ValueError: Shape mismatch: The shape of labels (received (3,)) should equal the shape of logits except for the last dimension (received (1, 3)).

1 Ответ

0 голосов
/ 02 марта 2020
labels = tf.convert_to_tensor(np.asarray([0,1,2]))
logits = tf.convert_to_tensor(np.asarray([[1,0,0],[0,1,0],[0,0,1]]), dtype=tf.float32)
tf.keras.losses.sparse_categorical_crossentropy(labels, logits)
<tf.Tensor: shape=(3,), dtype=float32, numpy=array([2.3841855e-07, 2.3841855e-07, 2.3841855e-07], dtype=float32)>

sparse означает, что целые числа, которые вы указываете в labels, фактически представляют метки классов, то есть sparse_categorical_crossentropy_loss преобразует их в одну горячую кодировку (например, logits). Понятия не имею, что означает from_logits, извините.

Примечание. Тот факт, что у вас есть tf.convert_to_tensor, заключается в том, чтобы избежать ошибки в tensorflow.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...