В текущей ветви 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 : я знаю, что мои образцы, которые являются изображениями, имеют некоторые все-нулевые строки и столбцы в целевом объекте, так что это приведет к делению на ноль для этих строк или столбцов. Вычисление означает, что для нескольких измерений одновременно, то есть полные изображения, которые гарантированно не являются все нулевыми, решает эту непосредственную проблему, но все же это поднимает вопрос выше.)