如何实现包含具有不同激活函数的神经元的单个隐藏层?
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
输出。
- 使用激活对其进行压缩,并在应用相应的激活时迭代压缩列表
- 堆叠输出以创建单个张量
我正在尝试在 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
输出。 - 使用激活对其进行压缩,并在应用相应的激活时迭代压缩列表
- 堆叠输出以创建单个张量