Уровни расширенной активации в Keras Functional API

При настройке нейронной сети с помощью Keras вы можете использовать либо модель Sequential, либо Functional API. Насколько я понимаю, первый легко настраивается и управляется, работает как линейный стек слоев, и что функциональный подход полезен для более сложных архитектур, особенно тех, которые включают совместное использование выходных данных внутреннего уровня. Мне лично нравится использовать функциональный API для универсальности, однако у меня возникают трудности с расширенными уровнями активации, такими как LeakyReLU. При использовании стандартных активаций в последовательной модели можно написать:

model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
          loss='categorical_crossentropy',
          metrics=['accuracy'])

Точно так же в функциональном API это можно записать как:

inpt = Input(shape = (100,))
dense_1 = Dense(32, activation ='relu')(inpt)
out = Dense(10, activation ='softmax')(dense_2)
model = Model(inpt,out)
model.compile(optimizer='rmsprop',
          loss='categorical_crossentropy',
          metrics=['accuracy'])

Однако при использовании расширенных активаций, таких как LeakyReLU и PReLU, в этой последовательной модели мы записываем их как отдельные уровни. Например:

model = Sequential()
model.add(Dense(32, input_dim=100))
model.add(LeakyReLU(alpha=0.1))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
          loss='categorical_crossentropy',
          metrics=['accuracy'])

Теперь я предполагаю, что в подходе функционального API есть эквивалент:

inpt = Input(shape = (100,))
dense_1 = Dense(32)(inpt)
LR = LeakyReLU(alpha=0.1)(dense_1)
out = Dense(10, activation ='softmax')(LR)
model = Model(inpt,out)
model.compile(optimizer='rmsprop',
          loss='categorical_crossentropy',
          metrics=['accuracy'])

Мои вопросы:

  1. Это правильный синтаксис в функциональном подходе?
  2. Почему Keras требует новый уровень для этих расширенных функций активации, а не позволяет нам просто заменить 'relu'?
  3. Есть ли что-то принципиально иное в создании нового слоя для функции активации, а не в назначении его существующему определению уровня (как в первых примерах, где мы написали 'relu'), поскольку я понимаю, что вы всегда можете написать свои функции активации, включая стандартные -А новые слои, хотя читали, что этого следует избегать?

person Joseph Bullock    schedule 16.04.2018    source источник


Ответы (1)


  1. Нет, вы забыли подключить LeakyReLU к плотному слою:

    LR = LeakyReLU (альфа = 0,1) (плотный_1)

  2. Обычно расширенные активации имеют настраиваемые или обучаемые параметры, и они должны где-то храниться, имеет смысл сделать их слоями, так как затем вы можете получить доступ к этим параметрам и сохранить их.

  3. Делайте это только в том случае, если есть преимущество, например, настраиваемые параметры.
person Dr. Snoopy    schedule 16.04.2018
comment
Спасибо, я отредактировал свои вопросы, чтобы связать их. Это была просто ошибка, но рад, что остальное в порядке. И да, ладно, значит, вы можете узнать значение альфа для LeakyReLU, предположительно, учитывая некоторую функцию активации из слоя LeakyReLU? - person Joseph Bullock; 17.04.2018