Skip to content

Keras - Models

Keras - 模型(Sequential 和 Functional API)

Section titled “Keras - 模型(Sequential 和 Functional API)”

在 tf.keras 中,Model 是将层分组为可训练架构的中心对象。它定义了前向传播(输入数据如何通过层流向输出)并提供了训练(fit)、评估(evaluate)和预测(predict)的方法。tf.keras 提供了两种主要方式来创建模型:Sequential API 和 Functional API,此外还有用于高级定制的 Model Subclassing(模型子类化)。

Sequential 模型是 Keras 中构建模型的最简单方式。它适用于简单的层堆叠,其中每一层都只有一个输入张量和一个输出张量。可以将其视为数据的线性管道。

创建 Sequential 模型:

import tensorflow as tf
# 方法 1:将层列表传递给构造函数
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu', input_shape=(784,)), # 第一层需要 input_shape 参数
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
], name="my_sequential_model")
# 方法 2:使用 model.add() 逐步添加层
model_alt = tf.keras.Sequential(name="my_alt_sequential_model")
model_alt.add(tf.keras.layers.Dense(64, activation='relu', input_shape=(784,)))
model_alt.add(tf.keras.layers.Dense(64, activation='relu'))
model_alt.add(tf.keras.layers.Dense(10, activation='softmax'))

主要特点:

  • 简单易用,对于简单架构简洁。
  • 只有第一层需要 input_shape 参数;后续层会推断其输入形状。
  • 不适用于具有多个输入/输出、共享层或非线性拓扑的模型。

Functional API 提供了一种更灵活的方式来定义模型。它允许你构建复杂的层图,包括具有多个输入和输出、共享层和分支连接的模型。你可以将层视为操作并返回张量的函数。

使用 Functional API 创建模型:

import tensorflow as tf
# 1. 定义输入张量
# 指定模型期望的输入数据的形状和数据类型。
inputs = tf.keras.Input(shape=(784,), name="digits")
# 2. 定义层并连接它们(像函数调用一样)
# 每次层调用都接受一个张量并返回一个张量。
x = tf.keras.layers.Dense(64, activation='relu', name="dense_1")(inputs)
x = tf.keras.layers.Dense(64, activation='relu', name="dense_2")(x)
# 3. 定义输出张量
outputs = tf.keras.layers.Dense(10, activation='softmax', name="predictions")(x)
# 4. 创建模型
# 指定输入和输出张量来定义模型的边界。
functional_model = tf.keras.Model(inputs=inputs, outputs=outputs, name="mnist_functional_model")

主要特点:

  • 高度灵活,适用于任意模型架构。
  • 支持层共享和非线性连接。
  • 模型是明确定义的图,具有清晰的输入和输出。
  • 对于简单堆叠,比 Sequential API 稍微更详细/冗长。

Functional API 对于多输入模型(例如,组合图像和文本数据)或具有多个输出头(例如,同时预测类别和边界框)的模型等任务非常强大。

模型定义后(使用任一 API),你可以检查其属性:

  • model.summary(): 打印模型的文本摘要,包括层、输出形状和参数数量。
# 使用上面定义的 functional_model 为例
functional_model.summary()

示例 summary() 输出:

Model: "mnist_functional_model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
digits (InputLayer) [(None, 784)] 0
dense_1 (Dense) (None, 64) 50240
dense_2 (Dense) (None, 64) 4160
predictions (Dense) (None, 10) 650
=================================================================
Total params: 55050 (215.04 KB)
Trainable params: 55050 (215.04 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
  • model.layers: 访问模型的扁平层列表。
  • model.inputs / model.outputs: 访问模型的输入/输出张量(与 Functional API 一起使用时很有用)。

保存训练好的模型可以让你以后重复使用,无需重新训练或进行部署。tf.keras 提供了强大的保存机制。

推荐格式:TensorFlow SavedModel / Keras v3 (.keras)

Section titled “推荐格式:TensorFlow SavedModel / Keras v3 (.keras)”

首选的方法是将整个模型(架构、权重、优化器状态、编译信息)保存在 TensorFlow 的 SavedModel 格式或新的 Keras v3 格式(.keras 扩展名)中。这是最全面的选项。

# 保存整个模型(推荐)
model.save("my_complete_model.keras") # Keras v3 格式
# 或者
# model.save("my_saved_model_directory") # TensorFlow SavedModel 格式
# 重新加载模型
loaded_model = tf.keras.models.load_model("my_complete_model.keras")
# loaded_model.summary()

如果你只需要学习到的参数,并计划在代码中重新创建架构:

# 仅保存权重
model.save_weights("my_model_weights.weights.h5") # 使用 HDF5 格式
# 要加载权重,你需要先创建相同的模型架构
# new_model = create_model_architecture() # 你构建模型的函数
# new_model.load_weights("my_model_weights.weights.h5")

Keras 之前使用 HDF5 格式(.h5 扩展名)来保存模型。虽然为了向后兼容仍然支持,但现在推荐使用 .keras 格式来保存整个模型状态。

# 以遗留 HDF5 格式保存
# model.save("my_legacy_model.h5")
# 从 HDF5 加载
# loaded_legacy_model = tf.keras.models.load_model("my_legacy_model.h5")

选择 Sequential API 还是 Functional API 取决于你期望的神经网络架构的复杂性。两者都允许你在 tf.keras 框架内构建强大的深度学习模型。