You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras模型的call()与train_step()方法的调用时机及区别是什么?

问题解答

1. train_step() 不会覆盖 call()

二者是tf.keras.Model中完全独立的两个方法,签名、职责、触发场景都不存在冲突,不会出现覆盖的情况。

2. fit() 对两个方法的调用逻辑

二者都会在fit流程中被触发,但调用层级不同:

  • fit() 每次拿到一个batch的训练数据时,会直接调用你自定义的train_step()方法,执行单步训练逻辑
  • call()不会被fit()直接调用,它是被你写在train_step()里的self(inputs, training=True)这行代码间接触发的,这行代码的本质就是调用模型的前向传播逻辑。

3. 二者核心区别

  • 职责不同:call()仅负责定义模型的前向传播逻辑,即给定输入如何计算得到输出,不涉及损失计算、梯度更新、指标统计这类训练相关的操作;train_step()负责定义单步训练的完整流程,包括前向传播、损失计算、梯度求解、权重更新、指标更新全链路。
  • 触发场景不同:call()的使用场景更广,除了训练时被train_step调用,验证、预测、手动执行model(input)推理时都会触发;train_step()仅在调用fit()执行训练时会被调用,验证阶段调用的是test_step(),预测阶段调用的是predict_step()。
  • 自定义目的不同:自定义call()一般是为了实现特殊的前向计算逻辑,比如你代码中实现的RNN状态返回、传递逻辑;自定义train_step()一般是为了实现特殊的训练流程,比如GAN的交替训练、对抗训练、梯度裁剪等原生fit流程不支持的逻辑。

你提到的GAN示例没有自定义call(),是因为GAN的前向逻辑分别封装在生成器、判别器两个子模型中,train_step里直接调用两个子模型的前向即可,不需要额外定义GAN类本身的call方法。

4. 你的代码执行逻辑

你调用fit()训练时,单batch的执行流程如下:

  1. fit()将拆分好的批次数据(inputs, labels)传入你自定义的train_step()
  2. train_step()中执行self(inputs, training=True),触发你写的call()方法计算得到预测值
  3. 后续依次执行损失计算、梯度求解、权重更新、指标更新操作,返回当前批次的指标结果

内容的提问来源于stack exchange,提问作者kiriloff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:15:03