为什么IRIS数据集自定义训练场景下tf.GradientTape.jacobian返回None
问题原因
出现全None的根本原因是TensorFlow的GradientTape仅会记录自身上下文作用域内发生的张量运算,你当前的写法存在两处核心错误:
- 你存入
m_outputs_mod50的输出张量,计算过程发生在训练循环的epoch逻辑中,完全不在后续求雅可比时新建的GradientTape上下文范围内,该磁带没有记录输出和权重之间的计算依赖关系,无法推导梯度。 GradientTape的梯度/雅可比计算必须依赖计算过程中留存的反向传播追踪信息,你单独存储的输出张量和权重值只是静态的数值结果,没有绑定对应的计算路径信息,无法作为jacobian方法的有效入参配对使用。
解决方法
不要事后拿存储的静态值计算雅可比,应该在需要采集数据的epoch当场完成计算、存储结果,修改你训练循环中触发条件的代码即可:
# 提前新增雅可比结果存储列表 jacob_results = [] if epoch % 50 == 0: # 当场开启GradientTape记录计算过程 with tf.GradientTape() as tape: # 显式声明监视权重(非必须,可训练变量默认会被tape监视,加上更稳妥) tape.watch(model.weights) current_output = model(x) # 当场计算雅可比并存入列表,后续可直接调用 current_jacob = tape.jacobian(target=current_output, sources=model.weights) m_outputs_mod50.append(current_output) gather_weights.append(model.weights) jacob_results.append(current_jacob) print("Epoch {:03d}: Loss: {:.3f}, Accuracy: {:.3%}".format(epoch, epoch_loss_avg.result(), epoch_accuracy.result()))
内容的提问来源于stack exchange,提问作者christospap
相关产品推荐
相关产品推荐

