TensorFlow2.0自动求导机制(tf.GradientTape的用法)

article/2025/10/8 6:25:37

文章目录


在机器学习中,我们经常需要计算函数的导数,Tensorflow提供了自动求导机制来计算导数。

1 使用tf.GradientTape()计算 y = x 2 y=x^2 y=x2的导数

计算当x为3时x平方的导数(注意,变量x要设置为浮点型,不能为整型)

import tensorflow as tf  # tf为2.*版本 python版本为3.6
x = tf.Variable(initial_value = 3.0) # 定义变量x,初始化为3
with tf.GradientTape() as tape: # 在tf.GradientTape()的上下文中,所有的计算步骤都会被记录,用以求导y = tf.square(x) # y = x的平方
y_grad = tape.gradient(y,x) # 计算y关于x的导数
print(y)      # 输出3的平方  tf.Tensor(9.0, shape=(), dtype=float32)
print(y_grad) # 求出导数为6  tf.Tensor(6.0, shape=(), dtype=float32)

输出:

tf.Tensor(9.0, shape=(), dtype=float32)
tf.Tensor(6.0, shape=(), dtype=float32)

在这里定义了一个变量x,使用tf.variable()声明,与普通张量一样,该变量拥有形状、类型和值这3种属性。变量与普通张量的一个重要区别是,它默认能够被Tensorflow的自动求导机制求导,因此常用于定义机器模型的参数。

补充知识:tf.Variable () 将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息。神经网络训练中,常用该函数标记待训练参数。

2 当使用常量tf.constant时

上面的例子中使用了tf.Variable()定义x,下面我们展示使用tf.constant()定义x,注意两者之间求导时的不同,需要tape.watch(x)

import tensorflow as tf  # tf为2.x版本
x = tf.constant(3.0) # 定义常量x,初始化为3.0 (浮点型)
with tf.GradientTape() as tape: tape.watch(x) # 当x为常量时,需使用watch方法y = tf.square(x) 
y_grad = tape.gradient(y,x) 
print(y)      # 输出3的平方  tf.Tensor(9.0, shape=(), dtype=float32)
print(y_grad) # 求出导数为6  tf.Tensor(6.0, shape=(), dtype=float32)

3 对多个数求导时

注意使用persistent=True

import tensorflow as tf  
x = tf.constant(3.0) 
with tf.GradientTape(persistent=True) as tape:  # 注意使用persistent=Truetape.watch(x) y = tf.square(x)    # y = x的平方z = tf.pow(x,4)     # z = x的4次方
y_grad = tape.gradient(y,x) 
Z_grad = tape.gradient(z,x)
print(y.numpy())       # 9.0, 我们将tensor类型转换为numpy类型
print(y_grad.numpy())  # 6.0print(Z.numpy())       # 81.0
print(Z_grad.numpy())  # 108.0

4 使用求导机制进行线性回归的案例

房间数据预测,某城市2013-2017年的房间如表所示

年份房价
201312000
201414000
201515000
201616500
201717500

对数据进行回归处理,即使用线性模型y=ax+b拟合上述数据,因此,需要求出参数a和b。

我们使用求导机制计算线性回归

  • 使用tape.gradient(ys,xs)自动计算梯度
  • 使用optimizer.apply_gradients(grads_and_vars)自动更新参数模型。

其中,使用tf.keras.optimizers.SGD(learning=1e-3)声明一个梯度下降的优化器,其学习率为1e-3,优化器可以帮助我们根据计算出的求导结果更新模型参数,从而最小化某个特定的损害函数,具体使用方式是调用apply_gradients()方法。

更新模型参数的方法optimizer.apply_gradients()需要提供grads_and_vars,即更新的变量与损失函数关于这些变量的偏导数。具体来说,这里需要传入一个list,list的每一个元素是一个(变量的偏导数,变量)的元组,比如这里就是[(grad_a,a),(grad_b,b)]。使用zip()函数便可以使[grad_a,grad_b]与[a,b]进行对应拼装。

具体代码如下:

import tensorflow as tf  # tf为2.0版本 python版本为3.6
import matplotlib.pyplot as plt 
import numpy as np
# 定义原数据
X_raw = np.array([2013,2014,2015,2016,2017],dtype=np.float32)
Y_raw = np.array([12000,14000,15000,16500,17500],dtype=np.float32)# 数据归一化
x = (X_raw - X_raw.min())/(X_raw.max() - X_raw.min())
y = (Y_raw - Y_raw.min())/(Y_raw.max() - Y_raw.min())
# 定义张量
X = tf.constant(x)
y = tf.constant(y)
# 定义参数
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a,b]num_epoch = 10000 # 定义迭代次数
optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3) # 定义优化器,用以后续更新参数
for e in range(num_epoch): # 迭代多次,更新参数a与b# 使用tf.GradientTape() 记录损失函数的梯度信息with tf.GradientTape() as tape:y_pred = a * X + b loss = tf.reduce_sum(tf.square(y_pred - y)) # 通过预测值与实际值 求出误差# Tensorflow 自动计算损失函数关于自变量(模型参数)的梯度grads = tape.gradient(loss,variables) # 求损失关于参数a b的梯度# Tensorflow 自动根据梯度更新参数,即利用梯度信息修改a与b,使得损失减小optimizer.apply_gradients(grads_and_vars=zip(grads,variables)) 
print(a,b)

输出:

<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.9817748> <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.0545703>

绘图查看线性回归结果:

# 用散点图画出原始数据,定义红色
plt.scatter(X_raw,Y_raw,c='r')
# 画出预测(用归一化后的数据计算a*(X_raw)+b,然后再还原)
plt.plot(X_raw,(a*((X_raw - X_raw.min())/(X_raw.max() - X_raw.min()))+b)*(Y_raw.max()-Y_raw.min())+Y_raw.min()  )

输出:

参考文献:《简明的TensorFlow2》李锡涵、李卓桓、朱金鹏


http://chatgpt.dhexx.cn/article/GljFe3g1.shtml

相关文章

矩阵求导运算

基本公式&#xff1a;Y A * X --> DY/DX AY X * A --> DY/DX AY A * X * B --> DY/DX A * BY A * X * B --> DY/DX B * A 1. 矩阵Y对标量x求导&#xff1a; 相当于每个元素求导数后转置一下&#xff0c;注意MN矩阵求导后变成NM了 Y [y(ij)] --> dY/dx …

autograd-自动求导系统

torch.autograd 权值的更新需要求解梯度&#xff0c;pytorch提供了自动求导系统&#xff0c;我们只需要搭建前向传播计算图&#xff0c;由autograd的方法就可以得到所有张量的梯度。 其中最常用的方法是backward torch.autograd.backward() 功能&#xff1a;自动求取各个节点…

导数与微分 — 高等数学

文章目录 考点一&#xff1a;导数的定义函数在一点处的导数单侧导数&#xff08;1&#xff09;左导数&#xff08;2&#xff09;右导数 充要条件笔记 考点二&#xff1a;可导与连续的关系知识点笔记 考点三&#xff1a;导数的几何意义知识点切线方程、法线方程笔记 考点四&…

05 指数函数求导

2^x的求导 前面我们探索了一些常见函数的导数&#xff0c;但是指数函数是非常重要的一种类型。 1. 从几何上探索 设t为天数&#xff0c;P(t)为人口数量。离散的图 要想图像连续就得转成质量&#xff0c;所以P(t)换成M(t)。dM/dt就是质量的微小变化率和天数的微小变化量的比例…

23微分方程和exp(At)

预备知识 1.1 一阶线性齐次微分方程的解 d y d x P ( x ) y 0 (1) \frac{dy}{dx}P(x)y0\tag{1} dxdy​P(x)y0(1) 其齐次通解为&#xff1a; y C e − ∫ P ( x ) d x (2) yCe^{-\int P(x)dx}\tag{2} yCe−∫P(x)dx(2) 令 P ( x ) − λ P(x)-\lambda P(x)−λ&#xff0c…

人工智能数学基础:无理数e的由来以及对数、指数函数的求导

一、e的由来 函数&#xff08;11/x&#xff09;x在x一>∞时的极限 由于数列{xn}&#xff08;11/n&#xff09;n在n一>∞时存在极限。 证明如下&#xff1a; 当将上述极限推广到n为实数x时也成立&#xff0c;因为任意一个实数都能找到一个n和n1&#xff0c;使得x∈[n,n…

x的1/x次方的导数是多少?怎么算?

方法一&#xff1a; 原式化为e的[1/x•ln(x)]次幂&#xff0c;再根据复合函数求导法则求解。 方法二&#xff1a;

c语言x的n次方导数,a的x次方的导数

a的x次方的导数2019-12-07 13:56:28文/董月 指数函数的求导公式&#xff1a;(a^x)(lna)(a^x)&#xff0c;实质上&#xff0c;求导就是一个求极限的过程&#xff0c;导数的四则运算法则也来源于极限的四则运算法则。反之&#xff0c;已知导函数也可以倒过来求原来的函数&#xf…

软件流程图及功能节点图

需求分析 根据产品原型图&#xff0c;为了弄清楚产品的业务流程以及确定项目中存在的功能点及其具体规则和要求&#xff0c;绘制出软件流程图以及功能节点图&#xff0c;本文以赞赞羊项目为例。 1.软件流程图&#xff1a;作用是弄清楚项目的业务流程。 流程图符号说明&#xff…

软件工程 -- 程序流程图

1.程序流程图&#xff1a;表示了程序的操作顺序&#xff0c;用于对控制流程的描述 1.1 符号 1.2 三种基本控制结构 1.2.1 顺序结构 1.2.2 分支结构 多分支结构 1.2.3 循环结构

QT案例 使用QGraphicsView和命令模式设计完成流程图功能软件,参考QT官方流程图案例【diagramscene】

之前总结资料时候&#xff0c;看到一个Qt实现流程的专栏&#xff0c;后面就想着参考这个项目和官方的【diagramscene】项目&#xff0c;自己再写一个流程图软件来总结学习下&#xff0c;于是就想到使用QGraphicsView来完成相关功能&#xff0c;再使用命令模式来优化使用过程&am…

软件工程-系统流程图

在软件工程可行性研究中需要建立新系统的高层逻辑模型&#xff0c;这个就需要系统流程图了。 作用 系统流程图时描述物理系统的工具 物理系统 所谓物理系统&#xff0c;就是一个具体实现的系统。 与程序流程图的区别 在系统流程图中某些符号与程序流程图中符号形式相同&#…

软件工程 可行性研究、系统流程图、数据流图。

第二章&#xff1a;可行性研究 1.1研究方案的可行性 &#xff08;1&#xff09;技术可行性 &#xff08;2&#xff09;操作可行性 &#xff08;3&#xff09;经济可行性 1.2系统流程图 系统流程图表达的是系统各部件间的流动情况&#xff0c;不是对信息进行加工处理的控制…

ipadpro画流程图_流程图制作软件,这款软件让你5分钟就能搞定流程图

流程图制作软件&#xff0c;这款软件让你5分钟就能搞定流程图 2019-08-05 16:34:24 3点赞 16收藏 0评论 流程图是用来表示算法、工作流的一种框图图示&#xff0c;其广泛应用于分析、设计和记录等领域。市面上绘制流程图的工具并不多&#xff0c;找到一款适合自己的软件变得尤其…

系统流程图

系统流程图 在进行可行性研究时需要理解和分析现有系统&#xff0c;并以概括的形式表达对现有系统的认识&#xff1b;进入设计阶段后应该把设想的新系统的逻辑模型变成物理模型&#xff0c;因此就需要描绘未来的物理系统的概貌。 系统流程图是概括地描绘物理系统的传统工具&…

软件工程系统流程图

对现行系统进行初步分析是可行性研究当中重要的一步&#xff0c;新系统的一些信息主要来源于现行系统同时要根据实际需求完成现行系统的部分功能&#xff0c;并在此基础上对现行系统中存在的问题进行改善和修复&#xff0c;分析现行系统的主要方法就是分析系统的各个部分功能模…

流程图培训

工具 wps 目前咱们在新建里面&#xff0c;可以新建流程图 构成流程图的图形符号及其作用 常用的流程图介绍 flowchart 和 BPMN 两种 flowchart: 最开始的全名是”Process Flow Charts”&#xff0c;即处理流程图表。 BPMN&#xff1a; 定义了业务流程图&#xff0c;其基…

SD软件流程图

SD软件流程图 SD软件流程图 Host configure ClockSD bus power controlchanging bus widthTimeout setting on data lineCard initialization and identificationTransaction Control Transaction Control without DataTransaction Control with DataAbort TransactionChange …

软件工程程序流程图

程序流程图 程序流程图&#xff08;Program Flow Chart&#xff09;是用统一规定的标准符号描述程序运行具体步骤的图形表示。程序框图的设计是在处理流程图的基础上&#xff0c;通过对输入输出数据和处理过程的详细分析&#xff0c;将计算机的主要运行步骤和内容标识出来。程…