1

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

我可以想到一个简单的例子,这样的配置可能会变得有用。
考虑尝试训练一个神经网络,该神经网络可以预测坐标值为 (x, y) 的任何给定 2D 点是否位于给定圆的内部或外部,该圆的中心和半径也定义在相同的 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 < 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 激活函数的解决方案对我来说似乎更聪明。

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

谢谢你。

4

1 回答 1

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]))

您也可以只添加“并行层”,每个层都有不同的激活,然后合并(例如求和)或连接它们的输出,然后再将其提供给下一层。

于 2018-04-05T02:48:59.133 回答