Что такое y_true и y_pred при создании пользовательской метрики в Keras?

Я хочу реализовать свою собственную метрику в Keras. Согласно документации, моя пользовательская метрика должна быть определена как функция, которая принимает в качестве входных данных два тензора y_pred и y_true и возвращает одно значение тензора.

Однако я смущен тем, что именно будет содержаться в этих тензорах y_pred и y_true когда выполняется оптимизация. Это всего лишь одна точка данных? Это целая партия? Вся эпоха (возможно, нет)? Есть ли способ получить формы тензоров?

Может ли кто-нибудь указать на заслуживающее доверия место, где я могу получить эту информацию? Любая помощь будет оценена по достоинству. Не уверен, если это уместно, но я использую TensorFlow.


Вещи, которые я пробовал до сих пор, чтобы ответить на это:

  • Проверка документации по метрикам Keras (нет объяснений там, где эти тензоры).
  • Проверяя исходный код для показателей Keras и пытаясь понять эти тензоры, просмотрев реализацию y_true для других показателей (это, по-видимому, предполагает, что y_true и y_pred имеют метки для всей партии, но я не уверен).
  • Чтение этих вопросов stackoverflow: 1, 2, 3 и другие (никто не отвечает на мой вопрос, большинство из них сосредоточено на OP, не понимающем разницу между тензором и значениями, вычисленными с использованием этого тензора во время сеанса).
  • Распечатайте значения y_true и y_pred во время оптимизации, определив такую метрику:
    def test_metric(y_true, y_pred):
        y_true = K.print_tensor(y_true)
        y_pred = K.print_tensor(y_pred)
        return y_true - y_pred

(к сожалению, во время оптимизации ничего не печатают).

Ответ 1

y_true и y_pred

Тензор y_true - это истинные данные (или целевые, наземные, правдивые), которые вы передаете методу соответствия.
Это преобразование массива пустышек y_train в тензор.

Тензор y_pred - это данные, спрогнозированные (рассчитанные, выведенные) вашей моделью.

Обычно оба y_true и y_pred имеют абсолютно одинаковую форму. Некоторые из потерь, такие как редкие, могут принимать их с различными формами.


Форма y_true

Содержит целую партию. Его первым измерением всегда является размер пакета, и он должен существовать, даже если пакет имеет только один элемент.

Два очень простых способа найти форму y_true:

  • проверьте ваши истинные/целевые данные: print(Y_train.shape)
  • проверьте свой model.summary() и посмотрите последний вывод

Но его первым измерением будет размер партии.

Итак, если ваш последний слой выдает (None, 1), форма y_true будет (batch, 1). Если последний уровень выводит (None, 200,200, 3), то y_true будет (batch, 200,200,3).


Пользовательские метрики и функции потерь

К сожалению, печать пользовательских метрик не будет раскрывать их содержание. Вы можете видеть их формы, например, с помощью print(K.int_shape(y_pred)).

Помните, что эти библиотеки сначала "компилируют график", а затем "запускают его с данными". Когда вы определяете свою потерю, вы находитесь на этапе компиляции, и для запроса данных требуется модель для запуска.

Но даже если результат вашей метрики многомерный, keras автоматически найдет способы вывести один скаляр для этой метрики. (Не уверен, что это за операция, но очень вероятно, что K.mean() спрятан под столом).

Источники. После того, как вы привыкнете к керасу, это понимание станет естественным благодаря простому прочтению этой части:

y_true: Истинные ярлыки. Тензор Theano/TensorFlow.
y_pred: Предсказания. Тензор Theano/TensorFlow той же формы, что и y_true.

Истинные метки означают истинные/целевые данные. Этикетки - это неправильно выбранное слово, это только "метки" в классификационных моделях.
Прогнозы означают результаты вашей модели.

Ответ 2

y_true - истинное значение (метки). и y_pred - это значения, которые предсказала ваша модель NN.

Размер (форма) тензоров зависит от размера партий (nb_batches).