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

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

代码清单3-1 使用GradientTape

python 复制代码
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

python 复制代码
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 利用嵌套的梯度带计算二阶梯度

python 复制代码
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

本文全部可执行代码:

python 复制代码
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)
相关推荐
golang学习记13 分钟前
免费解锁 Cursor AI 全功能:4 种开发者私藏方案揭秘
人工智能
图扑软件21 分钟前
热力图可视化为何被广泛应用?| 图扑数字孪生
大数据·人工智能·信息可视化·数字孪生·可视化·热力图·电力能源
qq_4369621823 分钟前
AI驱动数据分析革新:奥威BI一键生成智能报告
人工智能·信息可视化·数据分析
卓码软件测评33 分钟前
借助大语言模型实现高效测试迁移:Airbnb的大规模实践
开发语言·前端·javascript·人工智能·语言模型·自然语言处理
小白狮ww35 分钟前
dots.ocr 基于 1.7B 参数实现多语言文档处理,性能达 SOTA
人工智能·深度学习·机器学习·自然语言处理·ocr·小红书·文档处理
hrrrrb36 分钟前
【机器学习】无监督学习
人工智能·学习·机器学习
IT_陈寒39 分钟前
SpringBoot 3.0实战:这套配置让我轻松扛住百万并发,性能提升300%
前端·人工智能·后端
阿烦大大@1 小时前
探索Perplexity:当AI遇上搜索引擎的革命性突破
人工智能·搜索引擎
chenchihwen8 小时前
AI代码开发宝库系列:Function Call
人工智能·python·1024程序员节·dashscope
FreeBuf_8 小时前
微软Copilot被用于窃取OAuth令牌,AI Agent成为攻击者帮凶
人工智能·microsoft·copilot