Keras How to use max_value in Relu activation function
keras/activation.py中定义的relu函数是:
1 2 | def relu(x, alpha=0., max_value=None): return K.relu(x, alpha=alpha, max_value=max_value) |
它有一个最大值,可用于剪裁该值。现在,如何在代码中使用/调用它?我尝试了以下方法:(a)
1 2 3 4 5 | 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)
1 | Rel = Activation('relu',max_value=250) |
相同误差
(c)
1 2 | from keras.layers import activations uu = activations.relu(??,max_value=250) |
问题在于它期望输入出现在第一个值中。错误为"relu()接受至少1个参数(给定1个)"。
那么,我该如何使它成为一个层呢?
1 | model.add(activations.relu(max_value=250)) |
具有相同的问题"relu()至少接受1个参数(给定1个)"。
如果该文件不能用作层,那么似乎没有办法将剪辑值指定为relu。这意味着这里的评论https://github.com/fchollet/keras/issues/2119关闭提议的更改是错误的…有什么想法吗?谢谢!
您可以使用keras后端的relu功能。因此,首先导入后端:
1 | from keras import backend as K |
然后,您可以使用后端功能将自己的函数作为激活传递。这个看起来像
1 2 | def relu_advanced(x): return K.relu(x, max_value=250) |
然后你可以像这样使用它
1 | model.add(Dense(512, input_dim=1, activation=relu_advanced)) |
或
1 | model.add(Activation(relu_advanced)) |
不幸的是,您必须硬编码其他参数。因此,最好使用返回函数并传递自定义值的函数:
1 2 3 4 | 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 |
然后你可以通过
1 | model.add(Dense(512, input_dim=1, activation=create_relu_advanced(max_value=250))) |
或
1 | model.add(Activation(create_relu_advanced(max_value=250))) |
这就像一个lambda一样简单:
1 2 | from keras.activations import relu clipped_relu = lambda x: relu(x, max_value=3.14) |
然后这样使用:
1 2 | model.add(Conv2D(64, (3, 3))) model.add(Activation(clipped_relu)) |
当读取保存在
1 | model = load_model(model_file, custom_objects={'<lambda>': clipped_relu}) |
这就是我使用
1 2 | def reluclip(x, max_value = 20): return K.relu(x, max_value = max_value) |
第二步:在模型中添加