keras自定义回调函数查看训练的loss和accuracy方式

1. 背景介绍

在训练深度学习模型时,通常需要监控模型的训练过程以及模型在测试数据上的表现。其中,最常用的评估标准为损失函数(loss)和准确率(accuracy)。为了对模型进行更加细致的监控和调节,我们可以使用Keras提供的自定义回调函数来实时输出训练过程中的loss和accuracy。本文将介绍如何使用Keras自定义回调函数来查看训练的loss和accuracy,并给出示例代码。

2. 自定义回调函数

2.1 回调函数概述

在Keras中,回调函数(callback)可以在训练过程中的不同阶段进行特定操作。例如,在每个epoch结束后记录loss和accuracy等指标,保存模型等。Keras提供了多种内置的回调函数,如ModelCheckpoint、TensorBoard、EarlyStopping等。同时,Keras也支持用户自定义回调函数,以满足特定的需求。

2.2 自定义回调函数实现

要实现自定义回调函数,需要继承keras.callbacks.Callback类并实现其方法。在本文中,我们关注loss和accuracy这两个指标的实时输出,因此需要在on_epoch_end方法中进行操作。具体代码实现如下:

from keras.callbacks import Callback

class LossAndAccuracyCallback(Callback):

def __init__(self):

super(LossAndAccuracyCallback, self).__init__()

def on_epoch_end(self, epoch, logs=None):

logs = logs or {}

loss = logs.get('loss')

acc = logs.get('acc')

print('epoch:{}, loss:{}, acc:{}'.format(epoch+1, loss, acc))

在自定义回调函数中,我们重写了Callback类中的on_epoch_end方法,在每个epoch结束时调用该方法,并传入当前epoch数以及训练日志logs。logs中包含了当前epoch的loss和accuracy等训练指标。需要注意的是,logs中的指标名称与模型编译时指定的名称一致。在常用的模型中,loss和accuracy分别对应'loss'和'acc'。如果指定了多个评估指标,logs中会包含这些指标的名称和值。

3. 示例代码

我们以MNIST手写数字识别任务为例,演示如何使用自定义回调函数实时输出loss和accuracy。首先,我们加载数据并对其做预处理。

import keras

from keras.datasets import mnist

from keras.models import Sequential

from keras.layers import Dense, Dropout, Flatten

from keras.layers import Conv2D, MaxPooling2D

from keras import backend as K

batch_size = 128

num_classes = 10

epochs = 10

# input image dimensions

img_rows, img_cols = 28, 28

# the data, split between train and test sets

(x_train, y_train), (x_test, y_test) = mnist.load_data()

if K.image_data_format() == 'channels_first':

x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)

x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)

input_shape = (1, img_rows, img_cols)

else:

x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)

x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)

input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')

x_test = x_test.astype('float32')

x_train /= 255

x_test /= 255

y_train = keras.utils.to_categorical(y_train, num_classes)

y_test = keras.utils.to_categorical(y_test, num_classes)

在MNIST数据集上,我们使用了一个简单的卷积神经网络作为模型,具体代码实现如下。

model = Sequential()

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))

model.add(Conv2D(64, (3, 3), activation='relu'))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(128, activation='relu'))

model.add(Dropout(0.5))

model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,

optimizer=keras.optimizers.Adadelta(),

metrics=['accuracy'])

接着,我们定义LossAndAccuracyCallback回调函数并将其传入模型的fit方法中。

lac_cb = LossAndAccuracyCallback()

model.fit(x_train, y_train,

batch_size=batch_size,

epochs=epochs,

verbose=1,

validation_data=(x_test, y_test),

callbacks=[lac_cb])

训练过程的输出结果会包含loss和accuracy值,例如:

...

Train on 60000 samples, validate on 10000 samples

Epoch 1/10

60000/60000 [==============================] - 154s 3ms/step - loss: 0.2602 - accuracy: 0.9214 - val_loss: 0.0588 - val_accuracy: 0.9819

epoch:1, loss:0.26017404447960856, acc:0.9214333295822144

Epoch 2/10

60000/60000 [==============================] - 163s 3ms/step - loss: 0.0860 - accuracy: 0.9736 - val_loss: 0.0404 - val_accuracy: 0.9864

epoch:2, loss:0.08597958453834025, acc:0.9736166596412659

Epoch 3/10

60000/60000 [==============================] - 169s 3ms/step - loss: 0.0639 - accuracy: 0.9807 - val_loss: 0.0301 - val_accuracy: 0.9895

epoch:3, loss:0.06389832020378116, acc:0.980650007724762

根据输出结果,我们可以看到每个epoch的loss和accuracy值。需要注意的是,在输出loss和accuracy值时,我们使用了format方法进行格式化,将epoch数、loss值和accuracy值分别插入字符串中。此外,默认情况下,Keras会将每个epoch的训练日志输出到控制台,并以列表的形式展示。为了避免混乱,我们在自定义回调函数中进行了简化,仅输出loss和accuracy值,以便更加清晰地观察训练过程。

后端开发标签