核心要点

  • model.compile 配置 optimizer、loss、metrics 三要素

  • compile 只绑定训练逻辑、不执行训练

  • 区分 Keras compile 与 @tf.function 图编译两种「编译」

  • 能写出 compile → fit → evaluate 完整流程

标准回答

TensorFlow 中「编译」有两层含义:

1. Keras model.compile()(最常见)

python
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 中注册。

追问

追问 1compile 时能直接传字符串 loss 吗?

可以。Keras 支持字符串简写,如 loss='sparse_categorical_crossentropy'optimizer='adam',会映射到默认参数的对象。当需要自定义参数(如 from_logits=True、自定义学习率)时,应改传对象实例 tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

追问 2fit 和 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 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具

  • Keras

    深度学习框架,64,020+ stars。高级神经网络 API,支持 TensorFlow、JAX、PyTorch 多后端。以用户友好著称,让深度学习从实验到生产的转化变得简单高效