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

TensorFlow 2中使用GradientTape获取梯度时属性不存在报错咨询

TensorFlow 2 迁移:梯度获取与输入张量获取修正

1. GradientTape 用法错误

TF2 中 tf.GradientTape 是上下文管理器,不能直接传入损失和权重参数,正确流程是:

  • 用 with tf.GradientTape() as tape: 包裹前向传播过程,让 tape 记录运算
  • 在上下文内计算模型的损失值
  • 调用 tape.gradient() 方法传入损失和可训练权重,得到梯度

2. 移除了 feed_inputs 等属性

TF2 中彻底移除了 TF1 里的 _feed_inputs、_feed_targets 这类私有属性,替代方案是:

  • 用 model.inputs 获取模型的输入张量列表
  • 目标张量(标签)、样本权重都是训练时外部传入的张量,无需从模型属性中获取,直接使用训练数据即可

修正后的完整示例代码

假设你使用标准 Keras 模型,以下是正确实现:

import tensorflow as tf

# 假设已定义好模型 model 和优化器 optimizer
# 准备训练用的输入、标签、样本权重(按需使用)
inputs = tf.random.normal([32, 10])  # 示例输入数据
targets = tf.random.normal([32, 2])   # 示例标签
sample_weights = tf.ones([32])        # 示例样本权重

with tf.GradientTape() as tape:
    # 前向传播计算预测结果(training=True 开启训练模式)
    predictions = model(inputs, training=True)
    # 计算总损失(复用模型编译时的损失函数)
    total_loss = model.compiled_loss(
        targets, predictions, sample_weight=sample_weights
    )

# 获取损失对可训练权重的梯度
grads = tape.gradient(total_loss, model.trainable_weights)

# 对应原需求的 symb_inputs,直接使用传入的张量
symb_inputs = (inputs, targets, sample_weights)

额外说明

  • 如果不需要样本权重,可直接从 compiled_loss 参数中移除
  • 也可以自定义损失计算,比如直接调用损失函数:total_loss = tf.keras.losses.MSE(targets, predictions)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:43:10