web-dev-qa-db-fra.com

Comment utilisez-vous Keras LeakyReLU en Python?

J'essaie de produire un CNN en utilisant Keras et j'ai écrit le code suivant:

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'])

Je veux utiliser la couche d'activation LeakyReL de Keras au lieu d'utiliser Activation('relu'). Cependant, j'ai essayé d'utiliser LeakyReLU(alpha=0.1) à la place, mais il s'agit d'une couche d'activation dans Keras, et j'obtiens une erreur d'utilisation d'une couche d'activation et non d'une fonction d'activation.

Comment utiliser LeakyReL dans cet exemple?

19
Jack Trute

Toutes les activations avancées dans Keras, y compris LeakyReLU, sont disponibles sous la forme layers , et non sous forme d'activations; par conséquent, vous devriez l'utiliser comme tel:

from keras.layers import LeakyReLU

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

Parfois, vous voulez juste un remplacement immédiat pour une couche d'activation intégrée et ne pas avoir à ajouter de couches d'activation supplémentaires uniquement à cette fin.

Pour cela, vous pouvez utiliser le fait que l'argument activation peut être une fonction.

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

Donc, ici, la fonction d'activation par défaut est définie comme "linéaire" pour la couche Conv2D. Est-il vrai d'écrire: (J'entends maintenant par les lignes suivantes, la fonction d'activation pour la couche Conv2D est définie sur LeakyRelu?)

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