- Вопрос или проблема
- Компиляция модели
- Определите обратный вызов ModelCheckpoint для сохранения лучшей модели
- Обучите модель без валидационных данных
- Загрузите лучшую модель
- Оцените модель на тестовом наборе
- Печать результатов
- Ответ или решение
- Проблема с функцией потерь
- Отрицательные значения потерь
- Вопрос с метриками
- Рекомендации для устранения проблем
Вопрос или проблема
У меня есть данные в виде изображений и 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()
. Причиной возникновения отрицательных значений потерь может быть:
-
Неиерархические данные: Разные версии TensorFlow могут обрабатывать устройства и данные по-разному. Убедитесь, что ваши данные одинаковы в обоих окружениях.
-
Инициализации случайных весов: Различные исходные веса модели могут вести к нестабильности потерь, особенно в рамках небольшой выборки.
-
Окружение выполнения: Разные версии TensorFlow и Keras могут по-разному обрабатывать вычисления. Убедитесь, что вы используете одну и ту же версию в обоих окружениях.
Вопрос с метриками
Сообщение о том, что вы не видите метрики классификации и потери регрессии во время обучения в Google Colab, может быть вызвано следующими проблемами:
- Логирование: Убедитесь, что логирование метрик настроено корректно. Вы можете настроить отображение каждой метрики в вашем
model.fit
:
history = model.fit(
X_train_images, [Y1_regression, Y2_classification],
epochs=10,
batch_size=64,
callbacks=callbacks,
verbose=1 # Убедитесь, что verbos включен для получения информации о метриках
)
- Мониторинг: Если вы используете
ModelCheckpoint
, убедитесь, что вы контролируете соответствующую метрику. Если вы контролируете общую потерюmonitor="loss"
, это может не отражать метрики отдельных выходов.
Рекомендации для устранения проблем
-
Версии библиотек: Проверьте, чтобы у вас были одинаковые версии TensorFlow, Keras и других библиотек в обоих окружениях. Это можно сделать через
pip freeze
и зафиксировав зависимостиrequirements.txt
. -
Изменение кода: Если обнаружите, что разница в результатах обусловлена версией TensorFlow, попробуйте использовать более стабильные функции потерь, такие как
MeanSquaredError
илиMeanAbsoluteError
, для тестирования. -
Анализ данных: Убедитесь, что данные
Y1_regression
иY2_classification
корректны и однотипны в обоих окружениях. -
Вывод информации о метриках: Убедитесь, что вы выводите нужные метрики и потери правильно, чтобы было легче диагностировать потенциальные проблемы.
Надеюсь, эти рекомендации помогут вам выявить и устранить проблему с вашей моделью. Если у вас есть дополнительные вопросы, не стесняйтесь их задавать.