Как реализовать один скрытый слой, содержащий нейроны с различными функциями активации?

Я пытаюсь создать собственную модель нейронной сети в TensorFlow 2.0. Я знаю, что в сообществе TF2.0 неоднократно советовали, что пользовательские модели должны быть построены как можно больше из существующих модулей в Функциональном API.

Однако в моей модели для одного скрытого слоя требуется наличие нейронов с различными функциями активации . Например, я хочу скрытый слой с тремя нейронами, один из которых является линейным, а два других - сигмоидами. И последняя модель просто несколько раз укладывает этот слой N раз.

В модуле tf.keras.layers нет подходящей функции для реализации вышеуказанного. Есть ли способ реализовать это сам, используя определение класса, например: MyDenseLayer (tf.keras.layers.Layer)? Тогда мне было бы легко построить полную модель, сложив этот слой, определенный пользователем.

Всего 1 ответ


Вы можете сделать следующее,

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 слое.

  • Сначала разделите Dense выход по axis=1 .
  • Заархивируйте его с помощью активаций и итерируйте упакованный список, применяя соответствующую активацию
  • Стек выходов, чтобы создать единый тензор

Есть идеи?

10000