开启掘金成长之旅!这是我参与「掘金日新计划 · 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.))
输出的结果如下:
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.))
使用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)
输出的结果如下:
同时求偏导,传入列表
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))
同时求偏导,传入列表,可以在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)
输出的结果如下:
两个目标函数对一个变量求导数
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
输出的结果如下: