web-dev-qa-db-ger.com

Wie benutzt man Keras LeakyReLU in Python?

Ich versuche, eine CNN mit Keras zu erstellen, und habe den folgenden Code geschrieben:

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

Ich möchte Keras 'LeakyReL Aktivierungslayer anstelle von Activation('relu') verwenden. Ich habe jedoch versucht, LeakyReLU(alpha=0.1) zu verwenden, dies ist jedoch eine Aktivierungsschicht in Keras, und es wird ein Fehler bezüglich der Verwendung einer Aktivierungsschicht und nicht einer Aktivierungsfunktion angezeigt.

Wie kann ich in diesem Beispiel LeakyReL verwenden?

19
Jack Trute

Alle erweiterten Aktivierungen in Keras, einschließlich LeakyReLU, sind als Ebenen und nicht als Aktivierungen verfügbar. Daher sollten Sie es als solches verwenden:

from keras.layers import LeakyReLU

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

Manchmal möchten Sie einfach einen Drop-In-Ersatz für eine integrierte Aktivierungsschicht und müssen nicht extra Aktivierungsschichten nur für diesen Zweck hinzufügen.

Dazu können Sie die Tatsache nutzen, dass das Argument activation eine Funktion sein kann.

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

Daher ist hier die Standardaktivierungsfunktion für die Conv2D-Ebene auf "linear" eingestellt. Ist es wahr zu schreiben: (Ich meine jetzt durch die folgenden Zeilen, die Aktivierungsfunktion für Conv2D-Ebene ist als LeakyRelu festgelegt?)

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