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(模型子类化)。
1. Sequential API (tf.keras.Sequential)
Section titled “1. Sequential API (tf.keras.Sequential)”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参数;后续层会推断其输入形状。 - 不适用于具有多个输入/输出、共享层或非线性拓扑的模型。
2. Functional API
Section titled “2. Functional API”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 一起使用时很有用)。
保存和加载模型
Section titled “保存和加载模型”保存训练好的模型可以让你以后重复使用,无需重新训练或进行部署。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")遗留的 HDF5 格式 (.h5)
Section titled “遗留的 HDF5 格式 (.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 框架内构建强大的深度学习模型。