Tensorflow自定义激活函数/函数/梯度

本文介绍了在Tensorflow中如何自定义分段激活函数,并解决因分段函数可能导致的梯度爆炸问题。通过分开编写代码和利用Tensorflow自带的自定义梯度功能,可以实现稳定且有效的激活函数定义。示例中提到了自定义函数的实现方式以及如何避免loss爆炸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tensorflow自定义激活函数/函数/梯度

(对于Tensorflow 1.x)
最近刚做完一个paper,需要自定义激活函数,记录一下心得,顺便帮助下有需要的小伙伴。大刀阔斧,直接上解决方案:

1、对于分段(激活)函数,代码分开写

2、使用自带自定义梯度

详解

Tensorflow是自动求导(不懂就百度),因此我们不需要定义梯度,但大家可能会遇到和我一样的问题(在训练模型的时候loss爆炸),所以大家才会来查吧。
自定义激活函数/函数直接定义就可以,比如:

output = tf.exp(input)
output = tf.log(input)

但为什么有时候会梯度爆炸?
因为激活函数大多是参照relu进行修改,故大多是分段函数,分段函数在tensorflow中使用

tf.where(tf.greater(input, [0.0]),function1,function2)

funtion1计算大于0的数,function2计算小于等于0的数,但这就导致我构造的激活函数loss爆炸。原因不详,猜测是先计算所有输入都参与function1和function2的计算。
我使用了tensorflow定义swish的例子定义函数:

def _swish_shape(op):
  return [op.inputs[0].shape]

@function.Defun(shape_func=_swish_shape, func_name="swish_grad", noinline=True)
def _swish_grad(features, grad):
  sigmoid_features = math_ops.sigmoid(features)
  activation_grad = (
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值