def newactivation(x):
if x>0:
return K.relu(x, alpha=0, max_value=None)
else :
return x * K.sigmoid(0.7* x)
get_custom_objects().update({'newactivation': Activation(newactivation)})
我正在尝试在 keras 中为我的模型使用此激活函数,但我很难找到要替换的内容
if x>0:
我得到的错误:
文件 "/usr/local/lib/python3.4/dist-packages/tensorflow/python/framework/ops.py", 614 行,布尔值 raise TypeError("不允许将
tf.Tensor
用作 Pythonbool
。类型错误:不允许将
tf.Tensor
用作 Pythonbool
。使用if >t is not None:
而不是if t:
来测试是否定义了张量,并>使用 TensorFlow 操作(如 tf.cond(执行以张量值>为条件的子图。
有人可以帮我说清楚吗?
if x > 0
没有意义,因为x > 0
是一个张量,而不是一个布尔值。
要在 Keras 中执行条件语句,请使用 keras.backend.switch
。
例如您的
if x > 0:
return t1
else:
return t2
会成为
keras.backend.switch(x > 0, t1, t2)
尝试类似操作:
def newactivation(x):
return tf.cond(x>0, x, x * tf.sigmoid(0.7* x))
x 不是一个 python 变量,它是一个张量,在模型运行时将保存一个值。x的值只有在评估该操作时才知道,因此需要由TensorFlow(或Keras(评估条件。
您可以评估张量,然后检查条件
from keras.backend.tensorflow_backend import get_session
sess=get_session()
if sess.run(x)>0:
return t1
else:
return t2
get_session不适用于 TensorFlow 2.0。您可以在此处找到解决方案
灵感来自 ed Mar 21 '18 at 17:28 的先前答案汤姆霍斯金。这对我有用。tf.cond
def custom_activation(x):
return tf.cond(tf.greater(x, 0), lambda: ..., lambda: ....)