我正在使用Tensorflow,并希望以这样的方式训练权重,使神经元仅在神经元输出某个范围内的值时“激发”,并输出0或当输出值超出该范围时接近0。
我正在考虑使用“Sinc”(here)或“Gaussian”(here)作为激活函数。不幸的是Tensorflow不支持这个。
我需要为此添加新操作吗? Tensorflow确实支持实现“Sinc”或“Gaussian”所需的所有操作,因此它们也应该为训练实施渐变。
我尝试过使用它但不知何故,神经网络的所有权重和偏差都变为0。
答案 0 :(得分:2)
您可以使用基本TF操作实现这两个功能。我不建议从数学角度(大量的浅局部优化)使用周期性激活函数(或“准周期” - 在具有衍生符号变化的一般函数中),因此我建议不要使用sinc 。就高斯人而言,您可能需要好好注意初始化。关于这种“局部函数”的棘手问题是它们很快就会变为0,因此在提供训练数据时,必须确保最初的神经元激活处于“活动”部分。使用基于点积的方法(如sigmoid,relu等)更容易,因为你所要做的就是处理规模。对于高斯人来说,你实际上必须确保你的激活是“到位”。
答案 1 :(得分:1)
sinc函数可以是例如作为激活函数传递。有点乱,但有效。
def sinc(x):
atzero = tf.ones_like(x)
atother = tf.divide(tf.sin(x),x)
value = tf.where(tf.equal(x,0), atzero, atother )
return value
高斯:
def gaussian(x):
sq = tf.square(x)
neg = tf.negative(sq)
return tf.exp(neg)
答案 2 :(得分:1)
除了上述Laine Mikael的答案外,我发现这种特殊的sinc实现在后向传递过程中提供了nan
。这是一个基于numpy实现方式的替代方法:
def sinc(x):
x = tf.where(tf.abs(x) < 1e-20, 1e-20 * tf.ones_like(x), x)
return tf.sin(x) / x