如何实现包含具有不同激活函数的神经元的单个隐藏层?

How to implement a single hidden layer containing neurons with different activation functions?

我正在尝试在 TensorFlow 2.0 中创建自定义神经网络模型。我知道在 TF2.0 社区中反复建议自定义模型应尽可能使用 Functional API 中的现有模块构建。

但是,在我的模型中,要求一个隐藏层具有具有不同激活函数的神经元。例如,我想要一个包含三个神经元的隐藏层,其中一个是线性的,另外两个是 sigmoid。而最终的模型只是将这一层重复堆叠 N 次。

tf.keras.layers 模块中没有合适的函数来实现上述功能。有没有办法自己使用 class 定义来实现这一点,例如:MyDenseLayer(tf.keras.layers.Layer)?然后我通过堆叠这个自定义层来构建完整的模型就很容易了

您可以执行以下操作,

import tensorflow as tf
from tensorflow.keras.layers import Input, Lambda, Activation, Dense
from tensorflow.keras.models import Model

def f(x):
  return tf.stack([a(c) for c,a in zip(tf.unstack(x[0], axis=1), x[1])], axis=1)

inp = Input(shape=(10,))
out = Dense(3)(inp)
out = Lambda(lambda x: f(x))(
        [out, [Activation('linear'), Activation('sigmoid'), Activation('sigmoid')]]
      )
model = Model(inputs=inp, outputs=out)

解释:

诀窍在Lambda层。

  • 首先在 axis=1 上拆分 Dense 输出。
  • 使用激活对其进行压缩,并在应用相应的激活时迭代压缩列表
  • 堆叠输出以创建单个张量