TensorFlow 2.x关闭eager execution时Adam().minimize使用报错如何解决?
错误根因说明
- 第一次报错
TypeError: 'Tensor' object is not callable
优化器的minimize方法第一个入参要求传入可调用的损失计算函数,你传入的是已经计算完成的损失张量,本身不具备可调用属性,因此触发报错。 - 第二次报错
ValueError: No gradients provided for any variable
你提前在lambda外部完成了损失计算,lambda仅返回了一个静态的损失张量,损失和模型可训练参数之间的梯度追踪链路已经断裂,优化器无法获取梯度用于参数更新,因此触发报错。
解决方案
你可以任选以下任意一种写法修复问题:
方案1:直接将损失计算逻辑封装为可调用对象传入minimize
不要提前计算损失,把损失计算的逻辑放在传给minimize的可调用对象内,保证梯度链路完整:
def train(x, y): opt.minimize(lambda: loss_fn(x, y), var_list=model.trainable_variables)
方案2:显式计算梯度后更新(逻辑更清晰,更易调试)
手动通过梯度带完成梯度计算、梯度应用的全流程,避免隐式调用的逻辑问题:
def train(x, y): with tf.GradientTape() as tape: loss = loss_fn(x, y) grads = tape.gradient(loss, model.trainable_variables) opt.apply_gradients(zip(grads, model.trainable_variables))
额外注意
如果你是在TensorFlow 2.x环境下手动关闭了eager execution,也可以考虑恢复默认的eager执行模式,梯度追踪相关的问题排查会更简单。
内容的提问来源于stack exchange,提问作者narutoArea51
相关产品推荐
相关产品推荐

