2016-01-11 3 views
16

Это мой код, который работает, если я использую другие слои активации как TANH:Как использовать расширенные уровни активации в 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) 

В этом случае он не работает, и говорит «TypeError: объект„“PReLU не отозван» и ошибка вызывается в строке model.compile. Почему это так? Все незавершенные функции активации работают. Однако ни одна из расширенных функций активации, включая эту, не работает.

ответ

17

Правильный способ использования расширенных активаций, таких как PReLU, - использовать его с помощью метода add() и не обертывать его с помощью класса Activation. Пример:

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

- Если у нас есть два плотных слоя FC, следует добавить их после каждого из них, и если у нас также есть отсева, что нам делать? – fermat4214

4

При использовании Model API в Keras можно вызвать непосредственно функцию внутри Keras Layer. Вот пример:

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

Для Keras функционального API я думаю, правильный способ совместить Плотные и PRelu (или любой другой передовой активации), чтобы использовать его как это:

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

конечно один должен параметризовать слои в соответствии с проблемой

+0

Есть действительно немного примеров с расширенными активациями с использованием функционального API. Если вы хотите использовать несколько входов или выходов, это путь. Это дало мне большое представление. Благодарю. –

Смежные вопросы