核心要点
model.compile 配置 optimizer、loss、metrics 三要素
compile 只绑定训练逻辑、不执行训练
区分 Keras compile 与 @tf.function 图编译两种「编译」
能写出 compile → fit → evaluate 完整流程
标准回答
TensorFlow 中「编译」有两层含义:
1. Keras model.compile()(最常见)
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'],
)作用是绑定优化器、损失函数与评估指标,生成内部的 train_step/test_step,但不执行任何训练。随后调用 model.fit(x, y, epochs=10) 才真正迭代更新权重。
2. @tf.function 图编译
将 Python 函数追踪(trace)为 TensorFlow 计算图,融合算子、减少 Python 解释开销,从而加速 train_step。
完整流程:build 模型 → compile → fit / train_on_batch → evaluate → save。自定义训练循环可不 compile,改为手写 GradientTape + apply_gradients。选型上:标准监督学习用 compile + fit;GAN/RL 等需要精细控制梯度时用自定义循环。详见 深度学习训练技巧。
常见误区
⚠️ 常见踩坑
认为 compile 等于「训练完成」;混淆 Keras 的 model.compile 与 PyTorch 的 torch.compile;用了自定义损失却没在 compile 中注册。
追问
追问 1:compile 时能直接传字符串 loss 吗?
可以。Keras 支持字符串简写,如 loss='sparse_categorical_crossentropy'、optimizer='adam',会映射到默认参数的对象。当需要自定义参数(如 from_logits=True、自定义学习率)时,应改传对象实例 tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)。
追问 2:fit 和 train_on_batch 有什么区别?
题库专题:Batch Normalization 的作用是什么?fit 管理整个 epoch、验证集与回调(callbacks);train_on_batch 只做单步更新,适合自定义数据流或强化学习。两者都依赖已 compile 的模型(除非在子类化模型中重写了 train_step)。
题库延伸:相关专题 → Batch Normalization 的作用是什么?
追问 3:未 compile 就直接 fit 会怎样?
会抛出 RuntimeError,提示「You must compile your model before training/testing」,因为此时还没有绑定 optimizer、loss,也没有生成 train_step。例外是子类化模型中自己重写了 train_step 并在其中完成梯度计算,则可不依赖 compile。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出
- Tensorflow
全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具
- Keras
深度学习框架,64,020+ stars。高级神经网络 API,支持 TensorFlow、JAX、PyTorch 多后端。以用户友好著称,让深度学习从实验到生产的转化变得简单高效