tensorflow中使用tf.GradientTape来记录正向运算过程,(要求数据都是浮点型)然后反播磁带自动得到梯度值。
1、利用梯度磁带求导数
# f(x) = a*x**2 + b*x + c的导数x = tf.Variable(0.0, name="x", dtype=tf.float32)a = tf.constant(1.0)b = tf.constant(-2.0)c = tf.constant(1.0)with tf.GradientTape() as tape:y = a*tf.pow(x, 2) + b*x + cdy_dx = tape.gradient(y,x)dy_dx# 求函数的二阶导数with tf.GradientTape(persistent=True) as tape2:with tf.GradientTape() as tape1:y = a*tf.pow(x,2) + b*x + cdy_dx = tape1.gradient(y,x)dy2_dx2= tape2.gradient(dy_dx,x)dy2_dx2
# 对常量张量也可以求导,需要增加watchwith tf.GradientTape() as tape:tape.watch([a,b,c])y = a*tf.pow(x,2) + b*x + cdy_dx,dy_da,dy_db,dy_dc = tape.gradient(y,[x,a,b,c])print(dy_da)print(dy_dc)
2、利用梯度磁带和优化器求最小值
# 求f(x) = a*x**2 + b*x + c的最小值# 使用optimizer.apply_gradientsx = tf.Variable(0.0,name = "x",dtype = tf.float32)a = tf.constant(1.0)b = tf.constant(-2.0)c = tf.constant(1.0)optimizer = tf.keras.optimizers.SGD(learning_rate=0.001)for _ in range(1000):with tf.GradientTape() as tape:y = a*tf.pow(x,2) + b*x + cdy_dx = tape.gradient(y,x)optimizer.apply_gradients(grads_and_vars=[(dy_dx, x)])
