2
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 行,在bool raise TypeError("Using a tf.Tensoras a Python boolis not allowed."

TypeError:不允许将 atf.Tensor用作 Python 。bool使用if >t is not None:而不是if t:测试是否定义了张量,并 > 使用 TensorFlow 操作(例如 tf.cond)来执行以 > 张量值为条件的子图。

有人可以帮我说清楚吗?

4

4 回答 4

5

if x > 0没有意义,因为x > 0它是张量,而不是布尔值。

要在 Keras 中执行条件语句,请使用keras.backend.switch.

例如你的

if x > 0:
   return t1
else:
   return t2

会成为

keras.backend.switch(x > 0, t1, t2)
于 2018-03-21T17:22:43.257 回答
3

尝试类似:

def newactivation(x):
    return tf.cond(x>0, x, x * tf.sigmoid(0.7* x))

x 不是 python 变量,它是一个张量,在模型运行时将保存一个值。x 的值仅在计算该操作时才知道,因此需要由 TensorFlow(或 Keras)评估条件。

于 2018-03-21T17:28:27.117 回答
0

您可以评估张量,然后检查条件

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。您可以在此处找到解决方案

于 2018-03-21T17:40:39.830 回答
0

灵感来自 18 年 3 月 21 日 17:28 tomhosking 的上一个答案。这对我有用。tf.cond

def custom_activation(x):
    return tf.cond(tf.greater(x, 0), lambda: ..., lambda: ....)
于 2020-05-07T07:57:15.040 回答