我为我的自定义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渐变都设为零来解决我的问题。任何帮助深表感谢!