如何在 Keras 中使用高级激活层?
How to use advanced activation layers in Keras?
如果我使用像 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' object is not callable" 并且在 model.compile 行调用错误。为什么会这样?所有非高级激活函数都有效。但是,包括这个在内的高级激活函数都不起作用。
使用像 PReLU 这样的高级激活的正确方法是使用 add()
方法而不是使用 Activation
class 包装它。示例:
model = Sequential()
act = keras.layers.advanced_activations.PReLU(init='zero', weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(act)
如果使用Keras中的Model
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))
当然要根据问题参数化图层
如果我使用像 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' object is not callable" 并且在 model.compile 行调用错误。为什么会这样?所有非高级激活函数都有效。但是,包括这个在内的高级激活函数都不起作用。
使用像 PReLU 这样的高级激活的正确方法是使用 add()
方法而不是使用 Activation
class 包装它。示例:
model = Sequential()
act = keras.layers.advanced_activations.PReLU(init='zero', weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(act)
如果使用Keras中的Model
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))
当然要根据问题参数化图层