2016-01-11 30 views
16

Questo è il mio codice che funziona se uso altri livelli di attivazione come tanh:Come utilizzare i livelli di attivazione avanzati in Keras?

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) 

In questo caso, non funziona e dice "TypeError: oggetto 'PReLU' non è callable" e l'errore viene chiamato sulla linea model.compile. Perché è così? Funzionano tutte le funzioni di attivazione non avanzate. Tuttavia, nessuna delle funzioni di attivazione avanzate, inclusa questa, funziona.

risposta

17

Il modo corretto di utilizzare le attivazioni avanzate come PReLU è di utilizzarlo con il metodo add() e non di eseguirlo utilizzando la classe Activation. Esempio:

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

- Se abbiamo due strati FC densi, dovremmo aggiungere dopo ciascuno di essi e se abbiamo anche il dropout, cosa dovremmo fare? – fermat4214

4

Se si utilizza l'API Model in Keras è possibile chiamare direttamente la funzione all'interno della Keras Layer. Ecco un esempio:

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

Per Keras API funzionale Credo che il modo corretto per combinare (altra attivazione avanzato o qualsiasi) Denso e PRelu è quello di utilizzare in questo modo:

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

naturalmente si dovrebbe parametrizza i livelli in base al problema

+0

Esistono davvero pochi esempi con attivazioni avanzate che utilizzano l'API funzionale. Se si utilizzano più ingressi o uscite, questa è la strada da percorrere. Questo mi ha dato una grande intuizione. Grazie. –