改变keras RELU激活函数的阈值
Change the threshold value of the keras RELU activation function
我正在尝试在构建我的神经网络时更改激活函数的阈值 Relu
。
因此,初始代码是下面编写的代码,其中 relu 阈值的默认值为 0。
model = Sequential([
Dense(n_inputs, input_shape=(n_inputs, ), activation = 'relu'),
Dense(32, activation = 'relu'),
Dense(2, activation='softmax')
])
然而,Keras 提供了相同的功能实现,可以参考 here 并添加屏幕截图。
因此,我将代码更改为以下内容以传递自定义函数,结果出现以下错误。
from keras.activations import relu
model = Sequential([
Dense(n_inputs, input_shape=(n_inputs, ), activation = relu(threshold = 2)),
Dense(32, activation = relu(threshold = 2)),
Dense(2, activation='softmax')
])
错误: TypeError: relu() missing 1 required positional argument: 'x'
我知道错误是我没有在 relu 函数中使用 x 但我无法传递类似的东西。语法要求我写 model.add(layers.Activation(activations.relu))
但我将无法更改阈值。这是我需要解决方法或解决方案的地方。
然后我使用了 Layer implementation of the ReLU function ,它对我有用,如下所示,但我想知道是否有办法让激活函数实现工作,因为该层并不总是方便添加和我想在 Dense 函数内部做更多的修改。
对我有用的代码:-
from keras.layers import ReLU
model = Sequential([
Dense(n_inputs, input_shape=(n_inputs, )),
ReLU(threshold=4),
Dense(32),
ReLU(threshold=4),
Dense(2, activation='softmax')
])
您遇到的错误是合理的。但是,您可以在 relu
函数上使用以下技巧来完成您的工作。通过这种方式,您定义了一个函数,该函数接受必要的参数,例如 alpha
、threshold
等,并且在函数体中,您定义了另一个计算 relu
[= 的函数24=] activations with these parameters, and end returns to upper function.
# help(tf.keras.backend.relu)
from tensorflow.keras import backend as K
def relu_advanced(alpha=0.0, max_value=None, threshold=0):
def relu_plus(x):
return K.relu(x,
alpha = tf.cast(alpha, tf.float32),
max_value = max_value,
threshold= tf.cast(threshold, tf.float32))
return relu_plus
样本:
foo = tf.constant([-10, -5, 0.0, 5, 10], dtype = tf.float32)
tf.keras.activations.relu(foo).numpy()
array([ 0., 0., 0., 5., 10.], dtype=float32)
x = relu_advanced(threshold=1)
x(foo).numpy()
array([-0., -0., 0., 5., 10.], dtype=float32)
对于您的情况,只需按如下方式使用:
model = Sequential([
Dense(64, input_shape=(32, ), activation = relu_advanced(threshold=2)),
Dense(32, activation = relu_advanced(threshold=2)),
Dense(2, activation='softmax')
])
我正在尝试在构建我的神经网络时更改激活函数的阈值 Relu
。
因此,初始代码是下面编写的代码,其中 relu 阈值的默认值为 0。
model = Sequential([
Dense(n_inputs, input_shape=(n_inputs, ), activation = 'relu'),
Dense(32, activation = 'relu'),
Dense(2, activation='softmax')
])
然而,Keras 提供了相同的功能实现,可以参考 here 并添加屏幕截图。
因此,我将代码更改为以下内容以传递自定义函数,结果出现以下错误。
from keras.activations import relu
model = Sequential([
Dense(n_inputs, input_shape=(n_inputs, ), activation = relu(threshold = 2)),
Dense(32, activation = relu(threshold = 2)),
Dense(2, activation='softmax')
])
错误: TypeError: relu() missing 1 required positional argument: 'x'
我知道错误是我没有在 relu 函数中使用 x 但我无法传递类似的东西。语法要求我写 model.add(layers.Activation(activations.relu))
但我将无法更改阈值。这是我需要解决方法或解决方案的地方。
然后我使用了 Layer implementation of the ReLU function ,它对我有用,如下所示,但我想知道是否有办法让激活函数实现工作,因为该层并不总是方便添加和我想在 Dense 函数内部做更多的修改。
对我有用的代码:-
from keras.layers import ReLU
model = Sequential([
Dense(n_inputs, input_shape=(n_inputs, )),
ReLU(threshold=4),
Dense(32),
ReLU(threshold=4),
Dense(2, activation='softmax')
])
您遇到的错误是合理的。但是,您可以在 relu
函数上使用以下技巧来完成您的工作。通过这种方式,您定义了一个函数,该函数接受必要的参数,例如 alpha
、threshold
等,并且在函数体中,您定义了另一个计算 relu
[= 的函数24=] activations with these parameters, and end returns to upper function.
# help(tf.keras.backend.relu)
from tensorflow.keras import backend as K
def relu_advanced(alpha=0.0, max_value=None, threshold=0):
def relu_plus(x):
return K.relu(x,
alpha = tf.cast(alpha, tf.float32),
max_value = max_value,
threshold= tf.cast(threshold, tf.float32))
return relu_plus
样本:
foo = tf.constant([-10, -5, 0.0, 5, 10], dtype = tf.float32)
tf.keras.activations.relu(foo).numpy()
array([ 0., 0., 0., 5., 10.], dtype=float32)
x = relu_advanced(threshold=1)
x(foo).numpy()
array([-0., -0., 0., 5., 10.], dtype=float32)
对于您的情况,只需按如下方式使用:
model = Sequential([
Dense(64, input_shape=(32, ), activation = relu_advanced(threshold=2)),
Dense(32, activation = relu_advanced(threshold=2)),
Dense(2, activation='softmax')
])