Как реализовать один скрытый слой, содержащий нейроны с различными функциями активации? - PullRequest
1 голос
/ 15 января 2020

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

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

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

1 Ответ

1 голос
/ 15 января 2020

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

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.
  • Сжатие с активациями и повторение сжатого списка при применении соответствующей активации
  • Сложите выходы, чтобы создать один тензор
...