Keras如何在Relu激活功能中使用max_value

时间:2016-12-20 22:54:06

标签: tensorflow keras activation-function

keras / activation.py中定义的Relu函数是:

    def relu(x, alpha=0., max_value=None):
      return K.relu(x, alpha=alpha, max_value=max_value)

它有一个max_value,可用于剪切值。现在如何在代码中使用/调用它? 我尝试过以下方法: (a)

    model.add(Dense(512,input_dim=1))
    model.add(Activation('relu',max_value=250))
    assert kwarg in allowed_kwargs, 'Keyword argument not understood: 
    ' + kwarg
    AssertionError: Keyword argument not understood: max_value

(b)

    Rel = Activation('relu',max_value=250)

同样的错误

(c)

    from keras.layers import activations
    uu = activations.relu(??,max_value=250)

这个问题是它希望输入存在于第一个值中。错误是' relu()至少需要1个参数(给定1个)'

那我怎么做这个图层呢?

    model.add(activations.relu(max_value=250))

有同样的问题' relu()需要至少1个参数(1个给定)'

如果此文件不能用作图层,则似乎无法为Relu指定剪辑值。这意味着此处https://github.com/fchollet/keras/issues/2119关闭提议的更改的评论是错误的...... 有什么想法吗?谢谢!

4 个答案:

答案 0 :(得分:7)

您可以使用Keras后端的ReLU功能。因此,首先导入后端:

from keras import backend as K

然后,您可以使用后端功能将自己的功能作为激活传递。 这看起来像

def relu_advanced(x):
    return K.relu(x, max_value=250)

然后你可以像

一样使用它
model.add(Dense(512, input_dim=1, activation=relu_advanced))

model.add(Activation(relu_advanced))

不幸的是,您必须硬编码其他参数。 因此,最好使用一个返回函数并传递自定义值的函数:

def create_relu_advanced(max_value=1.):        
    def relu_advanced(x):
        return K.relu(x, max_value=K.cast_to_floatx(max_value))
    return relu_advanced

然后你可以用

传递你的参数
model.add(Dense(512, input_dim=1, activation=create_relu_advanced(max_value=250)))

model.add(Activation(create_relu_advanced(max_value=250)))

答案 1 :(得分:0)

这是我使用Lambda图层实现剪辑relu所做的: 第1步:定义一个执行重新折叠的函数:

def reluclip(x, max_value = 20):
    return K.relu(x, max_value = max_value)

第2步:将Lambda图层添加到模型中: y = Lambda(function = reluclip)(y)

答案 2 :(得分:0)

那就像一个lambda一样简单:

from keras.activations import relu
clipped_relu = lambda x: relu(x, max_value=3.14)

然后像这样使用它:

model.add(Conv2D(64, (3, 3)))
model.add(Activation(clipped_relu))

在读取保存在hdf5中的模型时,请使用custom_objects字典:

model = load_model(model_file, custom_objects={'<lambda>': clipped_relu})

答案 3 :(得分:0)

经过下面的测试,可以正常工作

import keras

def clip_relu (x): 
    return keras.activations.relu(x, max_value=1.)

predictions=Dense(num_classes,activation=clip_relu,name='output')