在单个层中有多个激活函数类型神经元是否有意义?

时间:2018-03-30 15:35:06

标签: tensorflow neural-network tensorflow-estimator activation-function

我想知道是否存在任何情况或需要让多种类型的神经元彼此具有不同的激活功能,在单个层中混合,如果是这样,如何使用tensorflow Estimator框架来实现它。

我可以想到这样的配置可能变得有用的简单示例 考虑尝试训练一个神经网络,该网络可以预测任何给定的2D点,其坐标值为(x,y),位于给定圆的内部还是外部,其中心和半径也在同一个2D中定义空间。

假设我们的圆圈的中心位于(0.5,0.5),其半径定义为0.5 我们训练的策略可能是这样的:首先随机生成许多点,并判断每个点位于圆的内部或外部,以便我们可以将这些随机生成的坐标集作为特征和结果。每个内部/外部判断作为相应的标签。

通过验证下面的公式可以很容易地做出判断:
(x-0.5)^ 2 +(y-0.5)^ 2 < R ^ 2
这可以转换如下:
x ^ 2 - x + y ^ 2 - y + 0.5&lt; R ^ 2

现在,看看这最后一个公式,如果神经网络本身可以自动获得x ^ 2和y ^ 2等值,简单地从其特征值中得到(x, Y)。 为此,我想到了在标准的ReLU神经元中混合使用f(x)= x ^ 2作为激活函数的神经元。

老实说,我已经使用tensorflow Estimator框架完成了这个问题的几个测试实现,其中一个我已经看到将x ^ 2和y ^ 2作为附加功能(共4个特征值)应该与2个特征的情况相比,有助于有效的训练收敛,但使用f(x)= x ^ 2激活函数的解决方案对我来说更加明智。

这就是我在这里提出问题的方法。
希望我能听到任何意见。

谢谢。

1 个答案:

答案 0 :(得分:0)

特征工程(除x之外还提供x ^ 2作为输入)仍然是解决许多领域中ML问题的一个非常大的部分。我从未通过对中间层应用不同的激活来进行特征工程。通常它总是作为输入预处理的一部分完成。

如果你想试验它。我相信没有特别支持在TensorFlow中的层中具有多个激活功能。但是,你应该能够很容易地自己实现它。

这是一个示例,以循环方式沿着第一维(对于具有大的第一维的张量非常慢)将不同的激活函数应用于张量的每个切片。你可以做一些更聪明的切片。

def make_activator(activations):
    def activator(t):
        slices = tf.unstack(t)
        activated = []
        for s, act in zip(slices, itertools.cycle(activations)):
            activated.append(act(s))
        return tf.stack(activated)
    return activator

然后您可以在图层中使用它:

tf.layers.dense(..., activation=make_activator([tf.nn.relu, tf.square]))

您还可以添加“并行图层”,每个图层都有不同的激活,然后在将其输出到下一层之前合并(例如求和)或连接它们的输出。