Keras内置方法训练与评估模型完全指南

Keras内置方法训练与评估模型完全指南

keras-io Keras documentation, hosted live at keras.io keras-io 项目地址: https://gitcode.com/gh_mirrors/ke/keras-io

概述

本文将全面介绍如何使用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模型训练的基本流程:

  1. 构建模型:使用Functional API构建一个简单的全连接网络
  2. 准备数据:加载并预处理MNIST数据集
  3. 编译模型:指定优化器、损失函数和评估指标
  4. 训练模型:使用fit()方法进行训练
  5. 评估模型:使用evaluate()方法在测试集上评估性能
  6. 进行预测:使用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()方法是配置模型训练过程的关键,它接受三个重要参数:

  1. 优化器(optimizer):指定训练过程中使用的优化算法
  2. 损失函数(loss):定义模型要最小化的目标函数
  3. 评估指标(metrics):监控训练过程中的性能指标

内置优化器

Keras提供了多种内置优化器:

  • SGD():带有或不带动量的随机梯度下降
  • RMSprop():RMSprop优化器
  • Adam():Adam优化器

内置损失函数

常用损失函数包括:

  • MeanSquaredError():均方误差
  • KLDivergence():KL散度
  • CosineSimilarity():余弦相似度

内置评估指标

常用评估指标有:

  • AUC():ROC曲线下面积
  • Precision():精确率
  • Recall():召回率

自定义组件

虽然Keras提供了丰富的内置组件,但有时我们需要自定义功能。

自定义损失函数

有三种方法可以创建自定义损失函数:

  1. 使用函数:最简单的形式,接受y_true和y_pred作为输入
  2. 子类化Loss类:更灵活的方式,可以包含参数
  3. 在层中添加损失:通过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提供了多种验证方式:

  1. 手动验证集:通过validation_data参数传递
  2. 自动划分:使用validation_split参数自动划分部分训练数据作为验证集
  3. 回调函数:使用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模型。

keras-io Keras documentation, hosted live at keras.io keras-io 项目地址: https://gitcode.com/gh_mirrors/ke/keras-io

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时熹剑Gabrielle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值