Tensorflow 2.0自定义梯度函数
我试图为我在论文中找到的分段连续函数建立一个自定义梯度 对数函数、线性函数和指数函数之间的连续体及其改善神经网络泛化的潜力-Godfrey 当前问题:在我的网络的自定义层中,可学习参数的梯度爆炸,导致生成Tensorflow 2.0自定义梯度函数,tensorflow,keras,tensorflow2.0,keras-2,Tensorflow,Keras,Tensorflow2.0,Keras 2,我试图为我在论文中找到的分段连续函数建立一个自定义梯度 对数函数、线性函数和指数函数之间的连续体及其改善神经网络泛化的潜力-Godfrey 当前问题:在我的网络的自定义层中,可学习参数的梯度爆炸,导致生成nans。这个自定义层是在上面的文章中定义的一个可学习的激活函数 尝试过的解决方案 剪裁渐变优化器->当我使用例如keras.optimizer.Adam(clipnorm=0.5) 剪裁自定义层中learnable参数的值->这会产生一些我无法回忆的错误 创建自定义渐变计算以控制learna
nans
。这个自定义层是在上面的文章中定义的一个可学习的激活函数
尝试过的解决方案
- 剪裁渐变优化器->当我使用例如
keras.optimizer.Adam(clipnorm=0.5)
- 剪裁自定义层中learnable参数的值->这会产生一些我无法回忆的错误
- 创建自定义渐变计算以控制learnable参数的渐变->不确定应如何计算渐变
@tf.custom_gradient
def call_lt0(alpha_actv, x):
def grad(dx):
grad_x = 1/(1-alpha_actv * (alpha_actv + x))
grad_alpha = (tf.math.log(1-alpha_actv * (alpha_actv + x)) - ((2 * alpha_actv ** 2 + alpha_actv * x)/(alpha_actv ** 2 + alpha_actv * x - 1))) / alpha_actv ** 2
return grad_x * dx, grad_alpha * dx # denk ik..?
return (tf.math.exp(alpha_actv * x) - 1) / alpha_actv + alpha_actv, grad
这里我给出了x变量的梯度和可学习的参数alpha。但是,当我用tf.GradientTape
检查这些输出时,我只得到一个输出。。因为我对grad
的定义,我期望有两个。
另外,当我让keras/tensorflow计算所有内容,并再次使用tf.GradientTape
检查输出时,我只得到一个值。。这就是我对单个可学习参数的期望。
所以在某个地方我做错了什么,或者误解了grad
函数
有人能给我指路吗?请提供模型和培训的代码示例。@thushv89我很想,但这可能会让我的文章有点臃肿。。我相信我的错误可能在于我的自定义梯度的定义或解释。例如我想学习
alpha_actv
参数,但要学习,我还需要x
的值。在这个定义中,我还需要为x
提供渐变,但这个渐变不需要任何更新。。那我是不是做错了什么?你的模型是什么样子的?完全连接?