我正在尝试在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 tf
def 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]
我该如何解决?
答案 0 :(得分:1)
警告:您要执行的此操作没有渐变,因此无法进行训练。您将看到错误消息,例如“操作没有针对渐变的操作”或类似“不支持任何类型”的消息。
作为激活的一种解决方法,我相信“ relu”激活将是最接近和最好的选择,其优点是在大多数模型中都非常流行和使用。
在Keras中,您通常不运行会话。对于自定义操作,您可以使用backend函数来创建函数。
因此,您将使用Lambda
层:
import keras.backend as K
def hardlim(x):
return K.cast(K.greater_equal(x,0), K.floatx())
然后可以在层中使用activation=hardlim
。