我正在尝试在Keras中创建自己的自定义激活函数,当x < 0时返回0,当x >= 0时返回1
from keras.layers import Dense from keras.models import Sequential from keras.layers import Activation import tensorflow as tfdef hard_lim(x): zero = tf.convert_to_tensor(0., x.dtype.base_dtype) one = tf.convert_to_tensor(1., x.dtype.base_dtype) sess = tf.Session() if sess.run(tf.greater_equal(x, zero)): return one else: return zero model = Sequential() model.add(Dense(4, input_dim=2, activation=Activation(hard_lim)) model.add(Dense(2, activation=Activation(hard_lim)) model.add(Dense(1, activation=Activation(hard_lim))
这导致了以下错误
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor '1_input' with dtype float and shape [?,2]
我该如何修复这个问题?
回答:
警告:你想要的这个操作没有梯度,并且将无法使其之前的任何权重可训练。你会看到类似于“操作的梯度为None”或“None类型不受支持”之类的错误信息。
作为你激活函数的变通方法,我认为’relu’激活函数是最接近且最佳的选择,它的优点是非常流行且在大多数模型中使用。
在Keras中,你通常不运行会话。对于自定义操作,你使用后端函数创建一个函数。
因此,你可以使用Lambda
层:
import keras.backend as Kdef hardlim(x): return K.cast(K.greater_equal(x,0), K.floatx())
然后你可以在层中使用activation=hardlim
。