У меня проблема с многоуровневой классификацией, и мои y_true
и y_pred
во время обучения выглядят так:
y_true = tf.constant([[0, 1, 1, 0], [0, 1, 1, 0]])
y_pred = tf.constant([[0, 1, 0, 1], [0, 1, 1, 0]])
Я хочу сравнить эти два на основе каждой пары списков. Для этого я написал что-то вроде
values = tf.cast(x, "float32") == tf.cast(y, "float32")
bool_to_number_values = tf.cast(tranformed_values, "float32")
print(bool_to_number_values)
tranformed_values_summed = x.numpy().shape[0] - tf.reduce_sum(bool_to_number_values)
tranformed_values_summed.numpy()
Это возвращает
tf.Tensor(
[[1. 1. 0. 0.]
[1. 1. 1. 1.]], shape=(2, 4), dtype=float32)
и -4.0
потому что 2.0 - 6.0 == -4.0
Но я не хочу этого. Я хочу сравнить первый массив y_true
с первым массивом y_pred
, и если они идентичны, вернуть True
иначе False
. Та же логика применима ко второму массиву y_true
и y_pred
.
Таким образом, правильный результат должен быть
tf.Tensor(
[0,
1], , shape=(2,), dtype=float32)
#0: because the arrays on index 0 are not equal y_true[0] <> y_pred[0]
#1: because the arrays on index 1 are equal y_true[1] == y_pred[1]
и tranformed_values_summed.numpy() = 2.0 - 1.0 = 1.0
Я думаю, вы ищете tf.reduce_all:
tf.cast(tf.reduce_all(tf.equal(y_true, y_pred), axis=-1), tf.int32)
<tf.Tensor: shape=(2,), dtype=int32, numpy=array([0, 1])>
Копировать/вставить:
import tensorflow as tf
y_true = tf.constant([[0, 1, 1, 0], [0, 1, 1, 0]])
y_pred = tf.constant([[0, 1, 0, 1], [0, 1, 1, 0]])
tf.cast(tf.reduce_all(tf.equal(y_true, y_pred), axis=-1), tf.int32)
Это случается с лучшими из нас ;)
Николас мог бы, пожалуйста, проверить (в свободное время) этот вопрос stackoverflow.com/questions/65381855/… Рад получить ваши мысли по этому поводу.
Николай большое спасибо за ответ. Представьте, что я использовал
reduce_all
после проверки этого stackoverflow.com/questions/56394240/…, я пропустилaxis=-1
, что помогло.