Почему потери Keras учитывают только последнее измерение входных массивов? - PullRequest
1 голос
/ 25 марта 2019

В текущей ветви master в хранилище Keras это можно найти внутри losses.py:

def mean_absolute_error(y_true, y_pred):
    return K.mean(K.abs(y_pred - y_true), axis=-1)

https://github.com/keras-team/keras/blob/78e1f57c484da15466a34ed543a1cc4709617a2f/keras/losses.py#L17

Обратите внимание, что среднее значение вычисляется только попоследняя ось массивов y_true и y_pred из-за использования axis=-1.

Аналогично, реализация TensorFlow читает:

def mean_absolute_error(y_true, y_pred):
  return K.mean(math_ops.abs(y_pred - y_true), axis=-1)

https://github.com/tensorflow/tensorflow/blob/6612da89516247503f03ef76e974b51a434fb52e/tensorflow/python/keras/losses.py#L414

И то же самое верно для всех других потерь, определенных в тех же файлах.

Почему это так? (Это мой вопрос). Насколько я понимаю, потери являются скалярами, поэтомупочему сохраняются некоторые размеры массива?

Это просто фон и не часть моего вопроса .Причина, по которой я наткнулся на это, заключается в том, что я пытался внедрить некоторую нормализованную MAE в Keras, и, не задумываясь об этой проблеме, я попытался сделать следующее:

def normalized_mean_absolute_error(y_true, y_pred):
    return K.mean(K.abs(y_pred - y_true), axis=-1) / K.mean(K.abs(y_true), axis=-1)

Это приводит к NaN s, однако,возможно (я все еще расследую) из-за того, что я пытаюсь разделить нескалярный массив на другой.

( Edit : я знаю, что мои образцы, которые являются изображениями, имеют некоторые все-нулевые строки и столбцы в целевом объекте, так что это приведет к делению на ноль для этих строк или столбцов. Вычисление означает, что для нескольких измерений одновременно, то есть полные изображения, которые гарантированно не являются все нулевыми, решает эту непосредственную проблему, но все же это поднимает вопрос выше.)

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