2016-01-11 8 views
16

To jest mój kod, który działa, jeśli mogę użyć innych warstw aktywacji jak TANH:Jak korzystać z zaawansowanych warstw aktywacyjnych w 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) 

W tym przypadku to nie działa i mówi: „TypeError: obiekt«PReLU»nie jest wymagalne”, a błąd jest wywoływana w linii model.compile. Dlaczego tak jest? Wszystkie nie zaawansowane funkcje aktywacji działają. Jednak żadna z zaawansowanych funkcji aktywacji, w tym tej, nie działa.

Odpowiedz

17

Prawidłowym sposobem korzystania z zaawansowanych aktywacji, takich jak PReLU, jest użycie go z metodą add() i nie owijanie go przy użyciu klasy Activation. Przykład:

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

- Jeśli mamy dwie gęste warstwy FC, czy powinniśmy dodać po każdym z nich, a jeśli mamy również wyłączenie, co powinniśmy zrobić? – fermat4214

4

W przypadku korzystania z interfejsu API Model w Keras można zadzwonić bezpośrednio funkcję wewnątrz Keras Layer. Oto przykład:

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

Dla Keras API funkcjonalnej myślę poprawny sposób łączenia gęsty i PRelu (lub jakiegokolwiek innego zaawansowanego aktywacji) jest użycie go tak:

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

oczywiście trzeba sparametryzować warstwy według problemu

+0

Istnieje naprawdę niewiele przykładów z zaawansowanymi aktywacjami za pomocą funkcjonalnego interfejsu API. Jeśli chcesz użyć wielu wejść lub wyjść, to jest droga do zrobienia. To dało mi świetny wgląd. Dzięki. –

Powiązane problemy