2020.3.25学习笔记:函数求导,

主要是利用函数近似求导的公式编写代码。

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.))

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.)
# 多维函数求导其实也就是一维求导(偏导数),只需将比变量以为的参数看作实数。关键是理解lambda这种函数简洁的写法。

但是在tensorflow中已经自带了求导的API,但是注意使用格式,传入的需是变量。

import tensorflow as tf

x1 = tf.Variable(2.)
x2 = tf.Variable(3.)
with tf.GradientTape() as tape:	
	z = g(x1, x2)
dz_x1 = tape.gradient(z. x1)
# 因为求导机制比较消耗计算机内存,tf.GradientTape()不做任何参数处理时只能做一次求导,然后立马将内存释放掉,不能再进行求导,若要进行多次求导,需加参数。
with tf.GradientTape(persisitent=True) as tape:
	z = g(x1, x2)
dz_x1 = tape.gradietn(z, x1)
dz_x2 = tape.gradient(z, x2)
dz_x1, dz_x2 = tape.gradient(z, [x1, x2])
# 二阶求导,利用嵌套的模式
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] # 这里返回四个数。

# 接下来自己模拟一个简单的梯度下降
lr = 1e-2
x0 = tf.Variable(1.)
for iter in range(10):
	with tf.GradientTape() as tape:
		z = f(x0)
	dz_dx0 = tape.gradient(z, x0)
	x0.assign_sub(lr * dz_dx0)
	print('%d ===> %.3f' % (iter, f(x0)))
发布了42 篇原创文章 · 获赞 5 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览