深度学习(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)
相关推荐
字节跳动视频云技术团队2 分钟前
火山引擎多媒体实验室AIGC视频画质理解大模型VQ-Insight入选AAAI 2025 Oral
人工智能
谢景行^顾8 分钟前
初识机器学习
人工智能
AI工具学习测评10 分钟前
实测五款AI生成PPT工具,这款国产软件让我工作效率翻倍!
人工智能·powerpoint
Akamai中国12 分钟前
提升 EdgeWorker 可观测性:使用 DataStream 设置日志功能
人工智能·云计算·云服务
桂花饼20 分钟前
深度解析 Gemini 3 Pro Image (Nano Banana 2):Google 最强图像模型的核心能力与 API 对接指南
人工智能·aigc·ai绘图·nano banana 2·图像生成api·openai兼容接口·gemini 3 pro
阿里云大数据AI技术27 分钟前
朝阳永续基于阿里云 Milvus 构建金融智能投研产品“AI 小二”
数据库·人工智能
中杯可乐多加冰36 分钟前
基于 DeepSeek + MateChat 的证券智能投顾技术实践:打造金融领域的专属大Q模型助手
前端·人工智能
deephub41 分钟前
从零开始:用Python和Gemini 3四步搭建你自己的AI Agent
人工智能·python·大语言模型·agent
算家计算1 小时前
DeepSeek开源IMO金牌模型!跑出数学推理新高度,你的算力准备好了吗?
人工智能·资讯·deepseek
Codebee1 小时前
SOLO+OODER全栈框架:图生代码与组件化重构实战指南
前端·人工智能