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

2024-04-26 00:38:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩Tensorflow,希望通过这样的方式训练权重,使神经元只有在某个范围内输出一个值时才会“激发”,当输出值超出该范围时,才输出0或接近0。在

我想通过使用“Sinc”(here)或“高斯”(here)作为激活函数来实现这一点。不幸的是,Tensorflow不支持这一点。在

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

我试过用这个方法,但是不知怎么的,神经网络的所有权重和偏差都是0。在


Tags: 方法函数heretensorflow方式神经网络gaussian权重
3条回答

您可以使用基本的TF操作来实现这两个功能。我不建议从数学角度(大量浅层局部最优)在神经网络中使用周期性激活函数(或“准周期性”——一般函数具有变化的导数符号),因此我不建议使用sinc。对于gaussians,您可能需要很好地处理初始化。这种“局部函数”最棘手的地方是它们很快就会变成0,因此你必须确保当你得到训练数据时,你的神经元激活处于“活跃”状态。使用基于点积的方法(如sigmoid、relu等)会更容易,因为你所要做的就是处理尺度。对于高斯人来说,你必须确保你的激活“到位”。在

例如,可以作为激活函数传递的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

高斯分布:

^{pr2}$

除了上面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

相关问题 更多 >