Keras内置方法训练与评估模型完全指南
概述
本文将全面介绍如何使用Keras内置的fit()
、evaluate()
和predict()
方法进行模型训练、评估和预测。无论您使用Sequential模型、Functional API构建的模型,还是通过模型子类化从头编写的模型,这些方法都能以相同的方式工作。
准备工作
在开始之前,我们需要导入必要的库并准备数据:
import tensorflow as tf
import numpy as np
import keras
from keras import layers
from keras import ops
快速入门示例
让我们从一个完整的端到端示例开始,展示Keras模型训练的基本流程:
- 构建模型:使用Functional API构建一个简单的全连接网络
- 准备数据:加载并预处理MNIST数据集
- 编译模型:指定优化器、损失函数和评估指标
- 训练模型:使用
fit()
方法进行训练 - 评估模型:使用
evaluate()
方法在测试集上评估性能 - 进行预测:使用
predict()
方法对新数据进行预测
# 构建模型
inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense_1")(inputs)
x = layers.Dense(64, activation="relu", name="dense_2")(x)
outputs = layers.Dense(10, activation="softmax", name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
# 准备数据
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255
y_train = y_train.astype("float32")
y_test = y_test.astype("float32")
# 编译模型
model.compile(
optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["sparse_categorical_accuracy"],
)
# 训练模型
history = model.fit(x_train, y_train, batch_size=64, epochs=2, validation_split=0.2)
# 评估模型
results = model.evaluate(x_test, y_test, batch_size=128)
# 进行预测
predictions = model.predict(x_test[:3])
深入理解compile()方法
compile()
方法是配置模型训练过程的关键,它接受三个重要参数:
- 优化器(optimizer):指定训练过程中使用的优化算法
- 损失函数(loss):定义模型要最小化的目标函数
- 评估指标(metrics):监控训练过程中的性能指标
内置优化器
Keras提供了多种内置优化器:
SGD()
:带有或不带动量的随机梯度下降RMSprop()
:RMSprop优化器Adam()
:Adam优化器
内置损失函数
常用损失函数包括:
MeanSquaredError()
:均方误差KLDivergence()
:KL散度CosineSimilarity()
:余弦相似度
内置评估指标
常用评估指标有:
AUC()
:ROC曲线下面积Precision()
:精确率Recall()
:召回率
自定义组件
虽然Keras提供了丰富的内置组件,但有时我们需要自定义功能。
自定义损失函数
有三种方法可以创建自定义损失函数:
- 使用函数:最简单的形式,接受y_true和y_pred作为输入
- 子类化Loss类:更灵活的方式,可以包含参数
- 在层中添加损失:通过add_loss()方法
# 方法1:使用函数
def custom_mean_squared_error(y_true, y_pred):
return ops.mean(ops.square(y_true - y_pred), axis=-1)
# 方法2:子类化Loss类
class CustomMSE(keras.losses.Loss):
def __init__(self, regularization_factor=0.1):
super().__init__()
self.regularization_factor = regularization_factor
def call(self, y_true, y_pred):
mse = ops.mean(ops.square(y_true - y_pred), axis=-1)
reg = ops.mean(ops.square(0.5 - y_pred), axis=-1)
return mse + reg * self.regularization_factor
自定义评估指标
通过子类化keras.metrics.Metric
可以创建自定义指标:
class CategoricalTruePositives(keras.metrics.Metric):
def __init__(self, name="categorical_true_positives"):
super().__init__(name=name)
self.true_positives = self.add_variable(shape=(), name="ctp", initializer="zeros")
def update_state(self, y_true, y_pred):
y_pred = ops.reshape(ops.argmax(y_pred, axis=1), (-1, 1))
values = ops.cast(y_true, "int32") == ops.cast(y_pred, "int32")
self.true_positives.assign_add(ops.sum(ops.cast(values, "float32")))
def result(self):
return self.true_positives.value
def reset_state(self):
self.true_positives.assign(0.0)
使用tf.data Dataset进行训练
对于大型数据集,使用tf.data.Dataset
可以提高训练效率:
# 创建训练和测试Dataset
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_dataset = test_dataset.batch(64)
# 使用Dataset训练模型
model.fit(train_dataset, epochs=3)
# 使用Dataset评估模型
model.evaluate(test_dataset)
验证策略
Keras提供了多种验证方式:
- 手动验证集:通过
validation_data
参数传递 - 自动划分:使用
validation_split
参数自动划分部分训练数据作为验证集 - 回调函数:使用
EarlyStopping
等回调函数监控验证指标
# 使用validation_split自动划分验证集
model.fit(x_train, y_train, validation_split=0.2, epochs=2)
# 使用validation_data手动指定验证集
val_data = (x_val, y_val)
model.fit(x_train, y_train, validation_data=val_data, epochs=2)
多输入多输出模型
对于复杂的多输入多输出模型,可以分别为每个输出指定损失和指标:
# 多输出模型示例
inputs = keras.Input(shape=(128,))
output1 = layers.Dense(1, name="output1")(inputs)
output2 = layers.Dense(1, name="output2")(inputs)
model = keras.Model(inputs=inputs, outputs=[output1, output2])
model.compile(
optimizer="adam",
loss={
"output1": "mse",
"output2": "mse"
},
metrics={
"output1": ["mae"],
"output2": ["mae"]
},
loss_weights=[0.3, 0.7] # 为不同损失分配权重
)
总结
本文详细介绍了使用Keras内置方法训练和评估模型的完整流程。通过compile()
方法配置训练过程,使用fit()
进行训练,evaluate()
进行评估,predict()
进行预测。我们还探讨了如何自定义损失函数和评估指标,以及如何使用tf.data.Dataset
处理大型数据集。掌握这些核心方法将帮助您高效地开发和评估Keras模型。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考