我正在尝试创建一个泄漏的 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 问题。
我希望有人可以帮助我或指出我正确的方向。