求导diff(代码实战)

192 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第七天,点击查看活动详情

总结:此文为12月更文计划第七天第十二篇。

导数diff

导数在考研的时候学的很多了,在这里学习导数的时候,要在tensorflow框架下进行学习:

首先创建一个简单的求导函数:

def f(x):
    return 3. * x ** 2 + 2. * x - 1

此处为近似求导,x移动eps单位,也就是离自己很近的一个点的切线

def approximate_derivative(f, x, eps=1e-4):
    return (f(x + eps) - f(x - eps)) / (2. * eps)
print(approximate_derivative(f, 1.))

输出的结果如下:

image.png 求偏导数: 其中一个数不动,对另外一个变量求导
def g(x1, x2):
    return (x1 + 5) * (x2 ** 2)

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_x2

print(approximate_gradient(g, 2., 3.))
image.png

使用tf框架来进行求偏导:

#在tf中tape只能用一次 #被求导的是变量

x1 = tf.Variable(2.0)
x2 = tf.Variable(3.0)
with tf.GradientTape() as tape:
    z = g(x1, x2)

#求偏导
dz_x1 = tape.gradient(z, x1)
print(dz_x1)
print('-'*50)
print(x1)
print('-'*50)
try:
    dz_x2 = tape.gradient(z, x2)
except RuntimeError as ex:
    print(ex)

输出的结果如下: image.png

同时求偏导,传入列表


x1 = tf.Variable(2.0)
x2 = tf.Variable(3.0)
with tf.GradientTape() as tape:
    z = g(x1, x2)

dz_x1x2 = tape.gradient(z, [x1, x2])  #方便损失对多个w进行求导

print(dz_x1x2)
print('-'*50)
print(type(dz_x1x2))
image.png

同时求偏导,传入列表,可以在with中编写多个公式

x1 = tf.Variable(2.0)
x2 = tf.Variable(3.0)
with tf.GradientTape() as tape:
    z = g(x1, x2)
    z1=z*z

dz1_x1= tape.gradient(z1, x1)

print(dz1_x1)

输出的结果如下:

image.png

两个目标函数对一个变量求导数

x = tf.Variable(5.0)
with tf.GradientTape() as tape:
    z1 = 3 * x
    z2 = x ** 2
    z3 = x ** 3
tape.gradient([z1, z2,z3], x)   #3+10+75

输出的结果如下:

image.png