这是我的代码,如果我使用其他激活层,如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)
在这种情况下,它不起作用,并说"TypeError:'PReLU'对象不可调用",并在model.compile行调用错误.为什么会这样?所有非高级激活功能都有效.但是,高级激活功能(包括此功能)都不起作用.
使用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)
如果Model
在Keras中使用API,您可以直接调用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')
对于Keras功能性API,我认为结合Dense和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))
当然,应该根据问题对层进行参数化