Model.compile

Model.compile

Model.compile 是开源深度学习框架 Keras 中 Model 类的一个方法,用于在训练开始前为模型配置训练所需的组件,通常包括优化器(optimizer)、损失函数(loss)和评估指标(metrics)。调用之后,模型才能通过 fit 方法进入训练流程。它只设定训练的规则与目标,不改变模型各层的权重,也不负责网络结构本身,因此同一模型可以按需要重新编译以更换优化器、损失函数或指标。[1][2]

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

Model.compile 是 Keras 中 Model 类提供的方法,作用是把训练所需的规则绑定到已经搭好的模型上。Keras 官方文档对该方法的说明是「为训练配置模型」,调用形式以优化器、损失函数和指标为主要参数,例如 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), loss=tf.keras.losses.BinaryCrossentropy(), metrics=[tf.keras.metrics.BinaryAccuracy()])。[3]

它处理的对象是训练流程中的学习组件,而不是网络拓扑。模型的层数、每层单元数、激活函数等在建模阶段就已确定,编译阶段决定的是用什么标准衡量误差、用什么算法更新参数、以及训练过程中额外报告哪些数值。[1]

由于 Keras 把「建模—编译—训练」拆成彼此分离的步骤,编译是其中承上启下的一环。模型在 compile 之后才具备 fit、evaluate 等训练与评估行为,未编译的模型只能用于前向计算和预测。

原理

compile 的核心工作是把传入的参数解析成具体的对象,并挂到模型实例上。优化器既可以写成字符串名称,也可以传入优化器对象;损失函数可以是内置名称,也可以是接受真实值与预测值、返回张量的可调用对象;指标可以是名称、函数或 Metric 实例。多输出模型还可以按输出分别指定损失,配合 loss_weights 为各输出的损失赋以系数。[3]

在实现层面,compile 会把解析结果封装成损失容器和指标容器,并把编译状态标记为真。之后训练时,fit 调用这些容器计算损失、反向传播梯度并更新权重。源码中可以看到类似 self.compiled_loss = compile_utils.LossesContainer(...) 与 self.compiled_metrics = compile_utils.MetricsContainer(...) 的步骤,随后设置 _is_compiled 标志。[4]

多输出场景下,指标名称会按输出名生成,以避免重名冲突;两个指标若最终同名则直接报错。此外,当模型使用混合精度策略时,优化器会被包装成损失缩放优化器,compile 负责完成这层包装。[5][4]

以常用的交叉熵为例,训练目标可写作最小化损失函数:

$$L=-\frac{1}{N}\sum_{i=1}^{N}\sum_{c=1}^{C} y_{i,c}\log \hat{y}_{i,c}$$

优化器据此计算梯度并按学习率更新权重。compile 指定的是这个过程中的 L 与更新规则,指标 accuracy 等仅用于观测,不参与参数更新。

发展历程

Keras 由谷歌工程师弗朗索瓦·肖莱(François Chollet)创建,最初于 2015 年发布,早期版本即以 compile 与 fit 的简洁组合作为主要卖点,用来配置学习过程并随后按批次迭代训练数据。[6]

在 Keras 早期代码库的说明文档中,已能看到 model.compile(loss='categorical_crossentropy', optimizer='sgd') 的写法,说明编译器在项目公开初期就是训练接口的标准入口。[7]

2019 年前后,Keras 被整合进 TensorFlow 作为其高层接口,即 tf.keras,compile 也随之成为 TensorFlow 官方推荐训练流程中的固定一步。官方文档用「配置模型以便训练」来概括该方法,并说明编译与训练是先后关系。[6]

Keras 3 恢复为多后端框架,可在 TensorFlow、JAX 与 PyTorch 之上运行,compile 的写法在不同后端下保持一致,而训练步骤、自定义组件的实现则可能需要按后端分别适配。[8][9]

应用

compile 适用于 Keras 中所有基于 Model 的模型,包括 Sequential 与函数式模型。常见配置方式是选取优化器(如 SGD、Adam)、按任务类型选取损失函数(回归用均方误差,分类用交叉熵),并给出 accuracy 等指标用于观察训练进展。

迁移学习与微调场景中,改变某层的可训练标记后需要重新调用 compile,新的可训练状态才会生效。这一约定在 Keras 社区中被反复强调,属于使用流程中的固定环节。

需要更换损失函数、优化器、学习率或指标时,同样通过再次编译完成;已有权重不会因此被重置。若只想用训练好的模型做推理,则不编译也能直接调用预测。

模型保存与加载时,编译参数可以一并序列化,加载后按原设置恢复;保存时也可以选择不保存编译信息,此时只得到结构与权重。

局限

compile 只是训练前的配置动作,本身不执行任何参数更新,不能替代 fit 循环;它也不负责构建网络结构或初始化权重,weights 是否被重置与调用 compile 无关。

重新编译会导致优化器状态丢失,包括动量、学习率调度进度等,据社区讨论,这会让恢复训练初期出现一段调整期;权重本身不受影响。

metrics 中指定的指标默认不应用样本加权,若需要加权评估,需改用 weighted_metrics;官方文档对此有明确说明。[1]

使用编译指标时,evaluate 返回的数值可能多于 metrics_names 列出的名称,两者长度可能不一致,需要通过 compile 时的指标顺序来对应结果。[1]

在多后端环境下,compile 的写法统一,但自定义 train_step 等方法往往依赖具体后端的 API,跨后端复用需要额外改写。[9]

参见

  • Keras —— 提供 Model.compile 的开源深度学习框架

  • TensorFlow —— 将 Keras 作为高层接口整合的机器学习平台

  • 优化器 —— compile 中负责参数更新的学习组件

  • 损失函数 —— compile 中衡量预测与真实值差异的目标函数

  • 模型评估指标 —— compile 中用于观察训练与测试效果的度量

  • 迁移学习 —— 常需重新编译模型以应用层可训练状态的调整

参考资料

  1. None [引用日期2026-10-29]
  2. Keras documentation: Model training APIs [引用日期2026-10-29]
  3. compile [引用日期2026-10-29]
  4. def call(self, inputs, training=None, mask=None): [引用日期2026-10-29]
  5. compile_utils [引用日期2026-10-29]
  6. Kerasとは - IT用語辞典 e-Words [引用日期2026-10-29]
  7. softwareheritage.org 上的网页 [引用日期2026-10-29]
  8. keras-nightly [引用日期2026-10-29]
  9. keras.io 上的网页 [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:28:53Z

历史版本

本条目引用的词条
Keras Metric TensorFlow JAX PyTorch 优化器 损失函数 模型评估指标 迁移学习