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
相关产品推荐
相关产品推荐

