Вопрос или проблема
Я обучаю модель cnn, и у меня есть модель с несколькими выходами, которая имеет регрессионный и классификационный выход. У меня есть данные, столбец тангенса моих углов, но в результате я получаю output_loss: -224.1137
и output_regression_custom_metric: 89.7913
. Я не понимаю, почему есть отрицательные значения.
def loss_function(y_true, y_pred):
pred_angles = tf.math.atan(y_pred) * (180.0 / math.pi) # Преобразовать в градусы
true_angles = tf.math.atan(y_true) * (180.0 / math.pi) # Преобразовать в градусы
loss = tf.reduce_mean(tf.square(tf.abs(pred_angles - true_angles)))
return loss
def custom_metric(y_true, y_pred):
return tf.reduce_mean(tf.abs(tf.math.atan(y_true - y_pred) * (180.0 / math.pi)))
def loss_function(y_true, y_pred):
pred_angles = tf.math.atan(y_pred) * (180.0 / math.pi) # Преобразовать в градусы
true_angles = tf.math.atan(y_true) * (180.0 / math.pi) # Преобразовать в градусы
loss = tf.reduce_mean(tf.square(tf.abs(pred_angles - true_angles)))
return loss
Я ожидал положительное значение, а для метрик я ждал около 2,1
Ответ или решение
Проблема с функцией потерь и метрик: Отрицательные значения
Введение
При обучении модели сверточной нейронной сети (CNN) с несколькими выходами, в данном случае комбинирующей регрессионный и классификационный выход, может возникнуть путаница с отрицательными значениями, такими как output_loss: -224.1137
и output_regression_custom_metric: 89.7913
. В этой статье мы подробно рассмотрим, почему может возникнуть такая ситуация и что можно предпринять для её решения.
Причины появления отрицательных значений в функциях потерь и метрик
-
Ошибки в реализации функции потерь:
Ваша функция потерьloss_function
, хотя и использует распространённые методы вычисления, может содержать ошибки, которые приводят к неожиданным результатам. Рассмотрим примеры:def loss_function(y_true, y_pred): pred_angles = tf.math.atan(y_pred) * (180.0 / math.pi) true_angles = tf.math.atan(y_true) * (180.0 / math.pi) loss = tf.reduce_mean(tf.square(tf.abs(pred_angles - true_angles))) return loss
Здесь определение loss в конечном итоге должно быть неотрицательным, так как квадрат отклонения всегда будет положительным. Однако, если ваши
y_true
илиy_pred
имеют необычные значения (например, NaN или артефакты), это может привести к неожиданным результатам. -
Неправильное использование метрик:
Вашаcustom_metric
функция также может быть источником ошибки из-за использованных операций:def custom_metric(y_true, y_pred): return tf.reduce_mean(tf.abs(tf.math.atan(y_true - y_pred) * (180.0 / math.pi)))
Здесь происходит вычитание
y_true - y_pred
, и если иy_true
, иy_pred
могут принимать значения, значительно отличающиеся друг от друга, это может привести к вектору, который при обработке даёт неожиданные значения. В учитывании модулей (abs) есть большой риск попасть в область отрицательных значений. -
Проблемы с данными:
Обратите внимание на свои входные данные. Если данные на этапе преобразования содержат некорректные или недопустимые значения (например, NaN или бесконечности), то потери могут принимать невалидные значения.
Рекомендации по решению проблемы
-
Проверьте входные данные:
Убедитесь, что ваши данные не содержат недопустимых значений. Для этого используйте предварительную обработку, которая удаляет или корректирует такие значения. -
Упрощение функций:
Попробуйте использовать более простой блок для тестирования:def simple_loss(y_true, y_pred): return tf.reduce_mean(tf.square(y_true - y_pred))
-
Логирование и отладка:
Реализуйте логирование значенийy_true
иy_pred
непосредственно перед вызовом функции потерь. Это поможет идентифицировать, какие именно значения приводят к отрицательным метрикам. -
Обратите внимание на диапазон значений:
Убедитесь, что ваши данные находятся в адекватном диапазоне, подходящем для используемой вами функции активации и модели. Если такие значения какy_true
иy_pred
слишком велики или малы, это может вызвать проблемы в дальнейшем процессе. -
Итеративное тестирование:
Измените параметры обучения и тестируйте, как это влияет на значения функций потерь и метрик. Это позволит вам лучше понять, какие элементы влияют на поведение модели.
Заключение
Отрицательные значения в функциях потерь и метрик могут стать серьезной проблемой при обучении моделей. Поняв источники этих значений и применяя предложенные рекомендации, вы сможете повысить качество своей модели, избежать путаницы и улучшить ее предсказательную способность. Обратите внимание на детали реализации и тестируйте на каждом этапе, чтобы гарантировать успешный результат.