Tensorflow错误:Keras图层中的自定义渐变:形状必须等于等级,但必须为1和2

时间:2020-04-26 02:39:06

标签: python-3.x keras tensorflow2.0 gradient-descent tensorflow-gradient

我为我的自定义keras图层提供了一个有效的自定义激活功能,并且我正在尝试为其编写自定义渐变。创建此自定义渐变的原因是数值微分是不稳定的,经过几次训练后会导致NAN。我的激活函数采用张量输入x和张量变量k。在这种情况下,x是形状(32,128),而k是形状(1,128)。 k中的每个变量都是唯一的,所以我不能使用单个变量k。 dy是形状(32,128)。

程序遍历每一层的渐变函数,然后出现此错误

Exception has occurred: ValueError
Shapes must be equal rank, but are 1 and 2 for 'Adam/Adam/update_2/ResourceApplyAdam' (op: 'ResourceApplyAdam') with input shapes: [], [], [], [], [], [], [], [], [], [32,128].

这是我的激活功能代码:

@tf.custom_gradient
def tf_ReMahon_calc(x, k):
  def grad(dy):
    #dk=-(((e**(x*k))*x*(1+x))/((1+e**(x*k))**2))
    #dx=(1+e**(k*x)-k*e**(k*x)*(1+x))/((1+e**(x*k))**2)

    #return dy*dx,dy*dk
    return dy, dy

  return  tf.math.divide_no_nan(tf.math.add(1.0,x),tf.math.add(1.0,tf.math.exp(tf.math.multiply_no_nan(k,x)))), grad

dx是关于x的函数的导数,并且dk对于k是相同的。我评论了这些方面,尽管任何一种实现都会导致相同的错误。替换我的前向通过目标函数也仍然会导致相同的错误。我该如何纠正该错误?另外,还有另一种方法可以访问和修改渐变,这样我就不必创建自己的渐变函数了?

无法解决问题的尝试: 替换| return dy, dy ||与| return dy |或| return (dy, dy) |。 我也找不到一种方法来访问或更改通过tensorflow的常规自动微分实现的原始梯度。如果能够做到这一点,这也可以通过将所有NAN渐变都设为零来解决我的问题。任何帮助深表感谢!

0 个答案:

没有答案