Tensorflow2.x 利用“GradientTape 梯度带”自动求梯度

本文介绍了Tensorflow2.x的tf.GradientTape API,用于自动微分和计算梯度。内容包括梯度带的使用、中间结果处理、多目标梯度、控制流中的梯度、获取None梯度的情况以及如何处理零梯度。通过实例展示了如何在控制流中正确计算梯度,并解释了为何有时会得到None或零梯度的情况。
摘要由CSDN通过智能技术生成

自动微分和梯度

Tensorflow为自动微分提供了 tf.GradientTape API,将tf.GradientTape上下文内执行的相关运算记录到“条带”上,随后使用该条带通过反向传播模式计算梯度。

要实现自动微分,Tensorflow需要记忆前向传播过程中的运算顺序;
后向传播期间,Tensorflow以相反的顺序遍历此运算列表来计算梯度。

使用 GradientTape.gradient(target,sources) 计算某个目标相对于模型变量的梯度。
使用GradientTape.watch(x) 可以设置要监视的变量。

x = tf.constant(3.0)
with tf.GradientTape() as tape:
    tape.watch(x)
    y = x**2

dy_dx = tape.gradient(y,x)
dy_dx.numpy()

6.0

要停用监视所有 tf.Variables 的默认行为,请在创建梯度带时设置 watch_accessed_variables=False.

中间结果

如果要在统一计算中计算多个梯度,需要创建一个 persistent=True 的梯度带。

x = tf.constant([1,3.0])

with tf.GradientTape(persistent = True) as tape:
    tape.watch(x)
    y = x*x
    z = y*y

print(tape.gradient(z,x).numpy())
print(tape.gradient(y,x).numpy())

[ 4. 108.]
[2. 6.]

如果不设置 persistent=True,计算y对x梯度时会报错。
在这里插入图片描述

多目标的梯度

单目标的梯度:

x = tf.
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值