0

我正在尝试创建一个泄漏的 relu,它对于值 > 1 的梯度与对于值 < 0 的梯度相同。

我有一个似乎可以工作的实现,但它比正常的泄漏 relu 慢约 50%。所以我认为必须有更好的方法。

这是一个最小的例子:

##############################################################################

import tensorflow as tf
import tensorflow.keras as ke
import tensorflow.keras.layers as l

##############################################################################

def myRelu(x):
    return tf.where(x<0, x*0.1, tf.where(tf.math.logical_and(x>=0, x<=1), x, 0.9+x*0.1))

##############################################################################

def build_model_1():

    model_input = l.Input(shape=(None, 365, 15, 26, 2))

    x = l.Dense(1, activation='linear')(model_input)
    x = l.Lambda(myRelu)(x)
    # x = l.Activation(myRelu)(x) # or this

    model = ke.Model(inputs=[model_input], outputs=[x])
    model.compile(optimizer='Adam', loss='mean_squared_error')
    
    return model

##############################################################################

我已经在互联网上搜索了几个小时,但我还没有找到一个简单或明确的解决方案。我知道标准 tf.keras.layers.ReLU 支持 max_value ,我可以将其设置为 1 但我试图避免这种情况以避免垂死的 relu 问题。

我希望有人可以帮助我或指出我正确的方向。

4

0 回答 0