在Tensorflow中,我是否需要为“sinc”或“gaussian”激活函数添加新的op?

时间:2016-10-23 21:44:53

标签: python machine-learning tensorflow

我正在使用Tensorflow,并希望以这样的方式训练权重,使神经元仅在神经元输出某个范围内的值时“激发”,并输出0或当输出值超出该范围时接近0。

我正在考虑使用“Sinc”(here)或“Gaussian”(here)作为激活函数。不幸的是Tensorflow不支持这个。

我需要为此添加新操作吗? Tensorflow确实支持实现“Sinc”或“Gaussian”所需的所有操作,因此它们也应该为训练实施渐变。

我尝试过使用它但不知何故,神经网络的所有权重和偏差都变为0。

3 个答案:

答案 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