Проблема с моей пользовательской функцией потерь: я получаю отрицательное значение потерь в PyCharm и положительное в Google Colab или Kaggle.

Вопрос или проблема

У меня есть данные в виде изображений и 2 колонок: одна содержит значения тангенсов, а вторая указывает, являются ли мои значения отрицательными или положительными, и у меня есть два вывода: классификация и регрессия. Когда я запускаю свой код в Pycharm, я получаю отрицательные значения в потере для регрессии, но когда я использовал Google Colab, он дал мне положительные значения, но я не получаю метрики классификации и потерю регрессии во время обучения; единственное, что появляется, это общая потеря и метрики регрессии, а также потеря классификации. Я использую модель CNN.

`@keras.utils.register_keras_serializable(package=”Custom”)

def angular_loss(y_true, y_pred):
angles_true = tf.math.atan(y_true) * 180.0 / np.pi
angles_pred = tf.math.atan(y_pred) * 180.0 / np.pi
return tf.abs(angles_true – angles_pred)

@keras.utils.register_keras_serializable(package=”Custom”)
def rmse_degrees(y_true, y_pred):
angles_true = tf.math.atan(y_true) * 180.0 / np.pi
angles_pred = tf.math.atan(y_pred) * 180.0 / np.pi
return tf.sqrt(tf.reduce_mean(tf.square(angles_true – angles_pred)))

Компиляция модели

model.compile(
optimizer=”rmsprop”,
loss={
‘output_regression’: angular_loss,
‘output_classification’: ‘binary_crossentropy’
},
metrics={
‘output_regression’: [rmse_degrees],
‘output_classification’: [‘accuracy’]
}
)

Определите обратный вызов ModelCheckpoint для сохранения лучшей модели

callbacks = [
keras.callbacks.ModelCheckpoint(“model8.keras”, save_best_only=True, monitor=”loss”, mode=”min”)
]

Обучите модель без валидационных данных

history = model.fit(
X_train_images, [Y1_regression, Y2_classification],
epochs=10,
batch_size=64,
callbacks=callbacks
)

Загрузите лучшую модель

best_model = load_model(“model8.keras”, custom_objects={‘angular_loss’: angular_loss, ‘rmse_degrees’: rmse_degrees})

Оцените модель на тестовом наборе

test_loss, test_regression_loss, test_classification_loss, test_rmse_deg, test_accuracy = best_model.evaluate(
X_test_images, [Y1_regression_test, Y2_classification_test] , verbose = 0
)

Печать результатов

print(“\nРезультаты на тестовом наборе :”)
print(f”общая потеря : {test_loss}”)
print(f”потеря регрессии (в градусах) : {test_regression_loss}”)
print(f”потеря классификации : {test_classification_loss}”)
print(f”RMSE в градусах : {test_rmse_deg}”)
print(f”Метрики классификации : {test_accuracy}”)`

Ответ или решение

С учетом вашего запроса, ниже приводится детальный анализ проблемы с кастомной функцией потерь, которая возвращает отрицательные значения в PyCharm и положительные в Google Colab или на Kaggle. Я также рассмотрю вопрос о метриках классификации и потере регрессии.

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

Ваши кастомные функции потерь angular_loss и rmse_degrees могут давать разные результаты в зависимости от окружения, в котором они выполняются. Давайте проанализируем код:

@keras.utils.register_keras_serializable(package="Custom")
def angular_loss(y_true, y_pred):
    angles_true = tf.math.atan(y_true) * 180.0 / np.pi
    angles_pred = tf.math.atan(y_pred) * 180.0 / np.pi
    return tf.abs(angles_true - angles_pred)

@keras.utils.register_keras_serializable(package="Custom")
def rmse_degrees(y_true, y_pred):
    angles_true = tf.math.atan(y_true) * 180.0 / np.pi
    angles_pred = tf.math.atan(y_pred) * 180.0 / np.pi
    return tf.sqrt(tf.reduce_mean(tf.square(angles_true - angles_pred)))

Отрицательные значения потерь

Функция angular_loss возвращает абсолютное значение разницы углов. Это означает, что она не может возвращать отрицательные значения, поскольку использует tf.abs(). Причиной возникновения отрицательных значений потерь может быть:

  1. Неиерархические данные: Разные версии TensorFlow могут обрабатывать устройства и данные по-разному. Убедитесь, что ваши данные одинаковы в обоих окружениях.

  2. Инициализации случайных весов: Различные исходные веса модели могут вести к нестабильности потерь, особенно в рамках небольшой выборки.

  3. Окружение выполнения: Разные версии TensorFlow и Keras могут по-разному обрабатывать вычисления. Убедитесь, что вы используете одну и ту же версию в обоих окружениях.

Вопрос с метриками

Сообщение о том, что вы не видите метрики классификации и потери регрессии во время обучения в Google Colab, может быть вызвано следующими проблемами:

  1. Логирование: Убедитесь, что логирование метрик настроено корректно. Вы можете настроить отображение каждой метрики в вашем model.fit:
history = model.fit(
    X_train_images, [Y1_regression, Y2_classification],
    epochs=10,
    batch_size=64,
    callbacks=callbacks,
    verbose=1  # Убедитесь, что verbos включен для получения информации о метриках
)
  1. Мониторинг: Если вы используете ModelCheckpoint, убедитесь, что вы контролируете соответствующую метрику. Если вы контролируете общую потерю monitor="loss", это может не отражать метрики отдельных выходов.

Рекомендации для устранения проблем

  1. Версии библиотек: Проверьте, чтобы у вас были одинаковые версии TensorFlow, Keras и других библиотек в обоих окружениях. Это можно сделать через pip freeze и зафиксировав зависимости requirements.txt.

  2. Изменение кода: Если обнаружите, что разница в результатах обусловлена версией TensorFlow, попробуйте использовать более стабильные функции потерь, такие как MeanSquaredError или MeanAbsoluteError, для тестирования.

  3. Анализ данных: Убедитесь, что данные Y1_regression и Y2_classification корректны и однотипны в обоих окружениях.

  4. Вывод информации о метриках: Убедитесь, что вы выводите нужные метрики и потери правильно, чтобы было легче диагностировать потенциальные проблемы.

Надеюсь, эти рекомендации помогут вам выявить и устранить проблему с вашей моделью. Если у вас есть дополнительные вопросы, не стесняйтесь их задавать.

Оцените материал
Добавить комментарий

Капча загружается...