Model.compile
定义
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]
以常用的交叉熵为例,训练目标可写作最小化损失函数:
优化器据此计算梯度并按学习率更新权重。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]
参见
参考资料
- None [引用日期2026-10-29]
- Keras documentation: Model training APIs [引用日期2026-10-29]
- compile [引用日期2026-10-29]
- def call(self, inputs, training=None, mask=None): [引用日期2026-10-29]
- compile_utils [引用日期2026-10-29]
- Kerasとは - IT用語辞典 e-Words [引用日期2026-10-29]
- softwareheritage.org 上的网页 [引用日期2026-10-29]
- keras-nightly [引用日期2026-10-29]
- keras.io 上的网页 [引用日期2026-10-29]