当前位置: 首页 > news >正文

TensorFlow之微分求导

目录

  • 前言
  • 示例
    • 手动微分实现
    • 两个未知数, 求偏导
    • tf.GradientTape常量求导
    • tf.GradientTape二阶导数
    • tf.GradientTape实现梯度下降
    • 结合optimizer实现梯度下降

前言

在TensorFlow中,微分是个非常重要的概念。它们分别用于自动求导(计算梯度)和高效地处理数据。下面我将分别介绍这两个主题。

微分(Automatic Differentiation)
TensorFlow提供了强大的自动求导功能,这对于训练机器学习模型尤其重要,因为需要通过反向传播算法来更新模型参数。自动求导允许 TensorFlow 自动计算损失函数相对于模型参数的梯度,从而简化了模型训练过程中的优化步骤。

使用 tf.GradientTape
tf.GradientTape是TensorFlow 2.x 中实现自动求导的核心工具。它会记录在其上下文内的所有操作,并可以在需要时计算这些操作相对于输入张量的梯度。

示例

手动微分实现

from tensorflow import keras
import numpy as np
import pandas
import matplotlib.pyplot as plt# 3 * x^2 + 2 * x - 1
# 手动微分
def f(x):return 3. * x ** 2 + 2. * x - 1.# 近似求导
def approximate_derivative(f, x, eps=1e-3):return (f(x + eps) - f(x - eps)) / (2. * eps)print(approximate_derivative(f, 1.))

结果如下:

7.999999999999119

两个未知数, 求偏导

from tensorflow import keras
import numpy as np
import pandas
import matplotlib.pyplot as plt# 两个未知数, 求偏导
def g(x1, x2):return (x1 + 5) * (x2 ** 2)# 近似求导
def approximate_derivative(f, x, eps=1e-3):return (f(x + eps) - f(x - eps)) / (2. * eps)# 分别求g对x1,和x2的偏导.
def approximate_gradient(g, x1, x2, eps=1e-3):dg_x1 = approximate_derivative(lambda x: g(x, x2), x1, eps)dg_x2 = approximate_derivative(lambda x: g(x1, x), x2, eps)return dg_x1, dg_x2print(approximate_gradient(g, 2, 3))

结果如下:

(8.999999999993236, 41.999999999994486)

tf.GradientTape常量求导

from tensorflow import keras
import numpy as np
import pandas
import matplotlib.pyplot as plt
import tensorflow as tf x1 = tf.Variable(2.0)
x2 = tf.Variable(3.0)def g(x1, x2):return (x1 + 5) * (x2 ** 2)with tf.GradientTape() as tape:z = g(x1, x2)dz_x1x2 = tape.gradient(z, [x1, x2])
print(dz_x1x2)

结果如下:

[<tf.Tensor: shape=(), dtype=float32, numpy=9.0>, <tf.Tensor: shape=(), dtype=float32, numpy=42.0>]

tf.GradientTape二阶导数

from tensorflow import keras
import numpy as np
import pandas
import matplotlib.pyplot as plt
import tensorflow as tf x1 = tf.Variable(2.0)
x2 = tf.Variable(3.0)def g(x1, x2):return (x1 + 5) * (x2 ** 2)# 二阶导数
# 嵌套tf.GradientTape
x1 = tf.Variable(2.0)
x2 = tf.Variable(3.0)with tf.GradientTape(persistent=True) as outer_tape:with tf.GradientTape(persistent=True) as inner_tape:z = g(x1, x2)# 一阶导    inner_grads = inner_tape.gradient(z, [x1, x2])
# 对一阶导的结果再求导
outer_grads = [outer_tape.gradient(inner_grad, [x1, x2]) for inner_grad in inner_grads]
print(outer_grads)
del inner_tape
del outer_tape

结果如下:

[[None, <tf.Tensor: shape=(), dtype=float32, numpy=6.0>], [<tf.Tensor: shape=(), dtype=float32, numpy=6.0>, <tf.Tensor: shape=(), dtype=float32, numpy=14.0>]]

tf.GradientTape实现梯度下降

from tensorflow import keras
import numpy as np
import pandas
import matplotlib.pyplot as plt
import tensorflow as tf def f(x):return 3. * x ** 2 + 2. * x - 1.# 使用tf.GradientTape实现梯度下降
learing_rate = 0.1
x = tf.Variable(0.0)for _ in range(100):with tf.GradientTape() as tape:z = f(x)dz_dx = tape.gradient(z, x)x.assign_sub(learing_rate * dz_dx) # x -= learning_rate * dz_dx
print(x)

结果如下:

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

结合optimizer实现梯度下降

from tensorflow import keras
import numpy as np
import pandas
import matplotlib.pyplot as plt
import tensorflow as tf def f(x):return 3. * x ** 2 + 2. * x - 1.from tensorflow import keras# 结合optimizer去实现梯度下降
learing_rate = 0.1
x = tf.Variable(0.0)
optimizer = keras.optimizers.SGD(lr=learing_rate)for _ in range(100):with tf.GradientTape() as tape:z = f(x)dz_dx = tape.gradient(z, x)
#     x.assign_sub(learing_rate * dz_dx) # x -= learning_rate * dz_dxoptimizer.apply_gradients([(dz_dx, x)])
print(x)

结果如下

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

相关文章:

  • spark-cache模式
  • Java基础 5.13
  • SQL 中 INSTR 函数简介及 截取地址应用
  • 125.在 Vue3 中使用 OpenLayers 实现通过 WebGLVector 的方式添加海量点
  • Deepseek+Xmind:秒速生成思维导图与流程图
  • HTML、CSS 和 JavaScript 基础知识点
  • Tomcat和Nginx的主要区别
  • 5G如何让医疗更智能、更高效、更具未来感?
  • python共享内存实际案例,传输opencv frame
  • 中国古代史6
  • 【Nova UI】十六、打造组件库之滚动条组件(中):探秘滑块的计算逻辑
  • GNSS数据自动化下载系统的设计与实现
  • 互信息与KL散度:差异与应用全解析
  • Linux系统:文件系统前言,详解CHSLBA地址
  • 自适应稀疏核卷积网络:一种高效灵活的图像处理方案
  • iOS - 如何从appStore获取app版本信息
  • 电能质量扰动信号信号通过hilbert变换得到瞬时频率
  • 第五部分:第一节 - Node.js 简介与环境:让 JavaScript 走进厨房
  • 如何优化MCU中断响应时间
  • 【AI面试秘籍】| 第7期:多轮对话如何实现长期记忆?高频考点解析+代码实战
  • 跨文化戏剧的拓荒者与传承者——洪深与复旦剧社的百年回响
  • 首个偏头痛急性治疗药物可缓解前期症状
  • 学习教育期间违规吃喝,李献林、叶金广等人被通报
  • 外交部:正确认识和对待历史是检验日本能否恪守和平发展承诺的重要标准
  • 继71路之后,上海中心城区将迎来第二条中运量公交
  • 27岁杨阳拟任苏木镇党委副职,系2020年内蒙古自治区选调生