欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 深度学习(3)-TensorFlow入门(梯度带)

深度学习(3)-TensorFlow入门(梯度带)

2026/5/2 3:59:38 来源:https://blog.csdn.net/weixin_52370850/article/details/145815391  浏览:    关键词:深度学习(3)-TensorFlow入门(梯度带)

TensorFlow看起来很像NumPy。但是NumPy无法做到的是,检索任意可微表达式相对于其输入的梯度。你只需要创建一个GradientTape作用域,对一个或多个输入张量做一些计算,然后就可以检索计算结果相对于输入的梯度,如代码清单3-10所示。

代码清单3-1 使用GradientTape

input_var = tf.Variable(initial_value=3.)
with tf.GradientTape() as tape:result = tf.square(input_var)
gradient = tape.gradient(result, input_var)

要检索模型损失相对于权重的梯度,最常用的方法是gradients = tape.gradient(loss,weights)。tape.gradient()的输入张量是TensorFlow变量的输入可以是任意张量。但在默认情况下只会监视可训练变量(trainable variable)​。如果要监视常数张量,那么必须对其调用tape.watch(),手动将其标记为被监视的张量,如代码清单3-11所示。

代码清单3-11 对常数张量输入使用GradientTape

input_const = tf.constant(3.)
with tf.GradientTape() as tape:tape.watch(input_const)result = tf.square(input_const)
gradient = tape.gradient(result, input_const)

之所以必须这么做,是因为如果预先存储计算梯度所需的全部信息,那么计算成本非常大。为避免浪费资源,梯度带需要知道监视什么。它默认监视可训练变量,因为计算损失相对于可训练变量列表的梯度,是梯度带最常见的用途。

梯度带是一个非常强大的工具,它甚至能够计算二阶梯度(梯度的梯度)​。举例来说,物体位置相对于时间的梯度是这个物体的速度,二阶梯度则是它的加速度。如果测量一个垂直下落的苹果的位置随时间的变化,并且发现它满足position(time) =4.9 * time ** 2,那么它的加速度是多少?我们可以用两个嵌套的梯度带找出答案,如代码清单3-12所示。

代码清单3-12 利用嵌套的梯度带计算二阶梯度

time = tf.Variable(0.)
with tf.GradientTape() as outer_tape:with tf.GradientTape() as inner_tape:position =  4.9 * time ** 2speed = inner_tape.gradient(position, time)
acceleration = outer_tape.gradient(speed, time)----内梯度带计算出一个梯度,我们用外梯度带计算这个梯度的梯度。答案自然是4.9 * 2 = 9.8

本文全部可执行代码:

import tensorflow as tf
input_var = tf.Variable(initial_value=3.)
with tf.GradientTape() as tape:result = tf.square(input_var)
gradient = tape.gradient(result, input_var)print(gradient)input_const = tf.constant(3.)
with tf.GradientTape() as tape:tape.watch(input_const)result = tf.square(input_const)
gradient = tape.gradient(result, input_const)
print(gradient)time = tf.Variable(0.)
#外层梯度带
with tf.GradientTape() as outer_tape:#内层梯度带with tf.GradientTape() as inner_tape:#内层计算position =  4.9 * time ** 2#内层内层梯度计算speed = inner_tape.gradient(position, time)
#计算梯度的梯度
acceleration = outer_tape.gradient(speed, time)
#←----内梯度带计算出一个梯度,我们用外梯度带计算这个梯度的梯度。答案自然是4.9 * 2 = 9.8
print(acceleration)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词