在 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)
更清洁的解决方案
我一直在尝试将平方非线性激活函数 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)
更清洁的解决方案