Python 通过py_函数的高阶梯度

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

我想知道如何通过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 ([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)