При настройке нейронной сети с помощью 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'])
Мои вопросы:
- Это правильный синтаксис в функциональном подходе?
- Почему Keras требует новый уровень для этих расширенных функций активации, а не позволяет нам просто заменить
'relu'
? - Есть ли что-то принципиально иное в создании нового слоя для функции активации, а не в назначении его существующему определению уровня (как в первых примерах, где мы написали
'relu'
), поскольку я понимаю, что вы всегда можете написать свои функции активации, включая стандартные -А новые слои, хотя читали, что этого следует избегать?