Python 通过py_函数的高阶梯度
我想知道如何通过tf2.0中的tf.py_函数计算高阶梯度。下面的示例(从tensorflow doc稍作修改)生成正确的dy_dx,而aa_x为None。多谢各位Python 通过py_函数的高阶梯度,python,tensorflow,Python,Tensorflow,我想知道如何通过tf2.0中的tf.py_函数计算高阶梯度。下面的示例(从tensorflow doc稍作修改)生成正确的dy_dx,而aa_x为None。多谢各位 import tensorflow as tf import os def huber(x, delta): if tf.abs(x) <= delta: return x*x/ (2*delta) else: return tf.abs(x)-delta/2.0 x = tf.constant
import tensorflow as tf
import os
def huber(x, delta):
if tf.abs(x) <= delta:
return x*x/ (2*delta)
else:
return tf.abs(x)-delta/2.0
x = tf.constant ([2.0 ] )
z = tf.constant ([1.0 ] )
with tf.GradientTape (persistent=True) as g0:
g0.watch(x)
with tf.GradientTape (persistent=True) as g :
g.watch (x)
y = tf.py_function(func=huber, inp=[x, 3.] , Tout=tf.float32 )
dy_dx = g.gradient(y, x)
aa = tf.reduce_sum(dy_dx *z )
aa_x = g0.gradient (aa, x)
print (dy_dx)
print (aa_x)
将tensorflow导入为tf
导入操作系统
def huber(x,增量):
如果tf.abs(x)基于tf.py_函数的文档,则无法计算较高的>1st
导数。此函数允许在TensorFlow图中将计算表示为Python函数。特别是,它将Python函数func
封装在一个一次可微的TensorFlow操作中,该操作在启用急切执行的情况下执行它。这意味着您只能将其区分一次
如果你想得到高阶导数,你可以在Tensorflow 2.1.0中正常使用梯度函数
修改代码:
import tensorflow as tf # Tensorflow 2.1.0
import os
def huber(x, delta):
if tf.abs(x) <= delta:
return x*x/ (2*delta) ## x^2 / 2*delta
## x / delta - 1st derivative
## 1 / delta - 2nd derivative
else:
return tf.abs(x)-delta/2.0
x = tf.constant ([2.0 ])
z = tf.constant ([1.0 ])
with tf.GradientTape (persistent=True) as g0:
g0.watch(x)
with tf.GradientTape (persistent=True) as g :
g.watch (x)
# y = tf.py_function(func=huber, inp=[x, 3.0] , Tout=tf.float32 ) # once-differentiable
y= huber(x, 3.0)
dy_dx = g.gradient(y, x)
aa = tf.reduce_sum(dy_dx *z)
aa_x = g0.gradient(aa, x)
print (dy_dx) # tf.Tensor([0.6666667], shape=(1,), dtype=float32)
print (aa_x) # tf.Tensor([0.33333334], shape=(1,), dtype=float32)
将tensorflow作为tf导入#tensorflow 2.1.0
导入操作系统
def huber(x,增量):
如果tf.abs(x)