Path: blob/master/examples/keras_recipes/md/sklearn_metric_callbacks.md
3508 views
Evaluating and exporting scikit-learn metrics in a Keras callback
Author: lukewood
Date created: 10/07/2021
Last modified: 11/17/2023
Description: This example shows how to use Keras callbacks to evaluate and export non-TensorFlow based metrics.
Introduction
Keras callbacks allow for the execution of arbitrary code at various stages of the Keras training process. While Keras offers first-class support for metric evaluation, Keras metrics may only rely on TensorFlow code internally.
While there are TensorFlow implementations of many metrics online, some metrics are implemented using NumPy or another Python-based numerical computation library. By performing metric evaluation inside of a Keras callback, we can leverage any existing metric, and ultimately export the result to TensorBoard.
Jaccard score metric
This example makes use of a sklearn metric, sklearn.metrics.jaccard_score()
, and writes the result to TensorBoard using the tf.summary
API.
This template can be modified slightly to make it work with any existing sklearn metric.
Sample usage
Let's test our JaccardScoreCallback
class with a Keras model.
Epoch 1/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 16ms/step - accuracy: 0.7706 - loss: 0.7534 - val_accuracy: 0.9768 - val_loss: 0.0842 Epoch 2/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 16ms/step - accuracy: 0.9627 - loss: 0.1228 - val_accuracy: 0.9862 - val_loss: 0.0533 Epoch 3/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 16ms/step - accuracy: 0.9739 - loss: 0.0854 - val_accuracy: 0.9870 - val_loss: 0.0466 Epoch 4/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 17ms/step - accuracy: 0.9787 - loss: 0.0676 - val_accuracy: 0.9892 - val_loss: 0.0416 Epoch 5/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 17ms/step - accuracy: 0.9818 - loss: 0.0590 - val_accuracy: 0.9892 - val_loss: 0.0396 Epoch 6/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 17ms/step - accuracy: 0.9834 - loss: 0.0534 - val_accuracy: 0.9920 - val_loss: 0.0341 Epoch 7/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 17ms/step - accuracy: 0.9837 - loss: 0.0528 - val_accuracy: 0.9907 - val_loss: 0.0358 Epoch 8/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 8s 18ms/step - accuracy: 0.9847 - loss: 0.0466 - val_accuracy: 0.9908 - val_loss: 0.0327 Epoch 9/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 18ms/step - accuracy: 0.9873 - loss: 0.0397 - val_accuracy: 0.9912 - val_loss: 0.0346 Epoch 10/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 8s 18ms/step - accuracy: 0.9862 - loss: 0.0419 - val_accuracy: 0.9913 - val_loss: 0.0315 Epoch 11/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 17ms/step - accuracy: 0.9880 - loss: 0.0370 - val_accuracy: 0.9915 - val_loss: 0.0309 Epoch 12/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 17ms/step - accuracy: 0.9880 - loss: 0.0377 - val_accuracy: 0.9912 - val_loss: 0.0318 Epoch 13/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 17ms/step - accuracy: 0.9889 - loss: 0.0347 - val_accuracy: 0.9930 - val_loss: 0.0293 Epoch 14/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 7s 16ms/step - accuracy: 0.9896 - loss: 0.0333 - val_accuracy: 0.9913 - val_loss: 0.0326 Epoch 15/15 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step 422/422 ━━━━━━━━━━━━━━━━━━━━ 8s 18ms/step - accuracy: 0.9908 - loss: 0.0282 - val_accuracy: 0.9925 - val_loss: 0.0303
<keras.src.callbacks.history.History at 0x17f0655a0>