在 Keras 中实现平方非线性 (SQNL) 激活函数

Implementing the Square Non-linearity (SQNL) activation function in Keras

我一直在尝试将平方非线性激活函数 function 实现为 keras 模型的自定义激活函数。这是此列表中的第 10 个函数 https://en.wikipedia.org/wiki/Activation_function

我尝试使用 keras 后端,但我无法使用我需要的多个 if else 语句,所以我也尝试使用以下内容:

import tensorflow as tf
def square_nonlin(x):
    orig = x
    x = tf.where(orig >2.0, (tf.ones_like(x)) , x)
    x = tf.where(0.0 <= orig <=2.0, (x - tf.math.square(x)/4), x)
    x = tf.where(-2.0 <= orig < 0, (x + tf.math.square(x)/4), x)
    return tf.where(orig < -2.0, -1, x)

如您所见,我需要评估 4 个不同的子句。但是当我尝试编译 Keras 模型时,我仍然得到错误:

Using a `tf.Tensor` as a Python `bool` is not allowed

谁能帮我在 Keras 中实现这个功能?非常感谢。

我一周前才开始深入研究 tensorflow,并且正在积极尝试不同的激活函数。我想我知道你的两个问题是什么。在你的第二个和第三个作业中,你有复合条件,你需要将它们放在 tf.logical_and 下。您遇到的另一个问题是 return 行 return 上的最后一个 tf.where 是一个 -1,它不是 tensorflow 期望的向量。我还没有用 Keras 尝试过这个功能,但是在我的 "activation function" 测试仪中这段代码有效。

def square_nonlin(x):
    orig = x
    x = tf.where(orig >2.0, (tf.ones_like(x)) , x)
    x = tf.where(tf.logical_and(0.0 <= orig, orig <=2.0), (x - tf.math.square(x)/4.), x)
    x = tf.where(tf.logical_and(-2.0 <= orig, orig < 0), (x + tf.math.square(x)/4.), x)
    return tf.where(orig < -2.0, 0*x-1.0, x)

正如我所说,我是新手所以 "vectorize" -1,我将 x 向量乘以 0 并减去 -1生成一个填充有正确形状的 -1 的数组。也许经验丰富的 tensorflow 从业者之一可以建议正确的方法。

希望这对您有所帮助。

顺便说一句,tf.greater 等同于 tf.__gt__,这意味着 orig > 2.0 在 python 的幕后扩展为 tf.greater(orig, 2.0)

只是跟进。我在 Keras 中使用 MNIST 演示进行了尝试,激活函数按照上面的编码工作。

更新:

"vectorize" -1 的更简单的方法是使用 tf.ones_like 函数

所以将最后一行替换为

   return tf.where(orig < -2.0, -tf.ones_like(x), x)

更清洁的解决方案