Как вы используете Keras LeakyReLU в Python?

Я пытаюсь создать CNN, используя Keras, и написал следующий код:

batch_size = 64
epochs = 20
num_classes = 5

cnn_model = Sequential()
cnn_model.add(Conv2D(32, kernel_size=(3, 3), activation='linear',
                     input_shape=(380, 380, 1), padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D((2, 2), padding='same'))
cnn_model.add(Conv2D(64, (3, 3), activation='linear', padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
cnn_model.add(Conv2D(128, (3, 3), activation='linear', padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
cnn_model.add(Flatten())
cnn_model.add(Dense(128, activation='linear'))
cnn_model.add(Activation('relu'))
cnn_model.add(Dense(num_classes, activation='softmax'))

cnn_model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adam(), metrics=['accuracy'])

Я хочу использовать Keras LeakyReLU уровень активации вместо использования Activation('relu'). Однако я попытался использовать LeakyReLU(alpha=0.1) на месте, но это уровень активации в Keras, и я получаю сообщение об использовании уровня активации, а не функции активации.

Как я могу использовать LeakyReLU в этом примере?

Ответ 1

Все расширенные активации в LeakyReLU, включая LeakyReLU, доступны как слои, а не как активации; следовательно, вы должны использовать его как таковой:

from keras.layers import LeakyReLU

# instead of cnn_model.add(Activation('relu'))
# use
cnn_model.add(LeakyReLU(alpha=0.1))

Ответ 2

Так что здесь функция активации по умолчанию установлена как "линейная" для слоя Conv2D. Правильно ли писать: (сейчас я имею в виду следующие строки, функция активации для слоя Conv2D установлена как LeakyRelu?)

model.add(Conv2D(32, kernel_size=(3, 3),
           input_shape=(380,380,1))
model.add(LeakyReLU(alpha=0.01))

Ответ 3

Иногда вам просто нужна замена встроенного слоя активации без необходимости добавления дополнительных слоев активации только для этой цели.

Для этого вы можете использовать тот факт, что аргумент activation может быть функцией.

lrelu = lambda x: tf.keras.activations.relu(x, alpha=0.1)
model.add(Conv2D(..., activation=lrelu, ...)