web-dev-qa-db-fra.com

Comment utiliser les couches d'activation avancées dans Keras?

C'est mon code qui fonctionne si j'utilise d'autres couches d'activation comme tanh:

model = Sequential()
act = keras.layers.advanced_activations.PReLU(init='zero', weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(Activation(act))
model.add(Dropout(0.15))
model.add(Dense(64, init='uniform'))
model.add(Activation('softplus'))
model.add(Dropout(0.15))
model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_Epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)

Dans ce cas, cela ne fonctionne pas et indique "TypeError: l'objet" PReLU "n'est pas appelable" et l'erreur est appelée sur la ligne model.compile. pourquoi est-ce le cas? Toutes les fonctions d'activation non avancées fonctionnent. Cependant, aucune des fonctions d'activation avancées, y compris celle-ci, ne fonctionne.

30
pr338

La bonne façon d'utiliser les activations avancées comme PReLU est de l'utiliser avec la méthode add() et de ne pas l'encapsuler en utilisant la classe Activation. Exemple:

model = Sequential()
act = keras.layers.advanced_activations.PReLU(init='zero', weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(act)
30
Tarantula

Si vous utilisez l'API Model dans Keras, vous pouvez appeler directement la fonction à l'intérieur de Keras Layer. Voici un exemple:

from keras.models import Model
from keras.layers import Dense, Input
# using prelu?
from keras.layers.advanced_activations import PReLU

# Model definition
# encoder
inp = Input(shape=(16,))
lay = Dense(64, kernel_initializer='uniform',activation=PReLU(),
            name='encoder')(inp)
#decoder
out = Dense(2,kernel_initializer='uniform',activation=PReLU(), 
            name='decoder')(lay)

# build the model
model = Model(inputs=inp,outputs=out,name='cae')
21
Mattia Paterna

Pour l'API fonctionnelle Keras, je pense que la bonne façon de combiner Dense et PRelu (ou toute autre activation avancée) est de l'utiliser comme ceci:

focus_tns =focus_lr(enc_bidi_tns)

enc_dense_lr = k.layers.Dense(units=int(hidden_size))
enc_dense_tns = k.layers.PReLU()(enc_dense_lr(focus_tns))

dropout_lr = k.layers.Dropout(0.2)
dropout_tns = dropout_lr(enc_dense_tns)

enc_dense_lr2 = k.layers.Dense(units=int(hidden_size/4))
enc_dense_tns2 = k.layers.PReLU()(enc_dense_lr2(dropout_tns)) 

bien sûr, il faut paramétrer les couches en fonction du problème

5
alexander ostrikov