python - ¿Cómo se crea una función de activación personalizada con Keras?
keras-layer (3)
A veces, las activaciones estándar predeterminadas como ReLU, tanh, softmax, ... y las activaciones avanzadas como LeakyReLU no son suficientes. Y también podría no estar en keras-contrib .
¿Cómo se crea su propia función de activación?
Créditos a este comentario sobre el tema de Github por Ritchie Ng .
# Creating a model
from keras.models import Sequential
from keras.layers import Dense
# Custom activation function
from keras.layers import Activation
from keras import backend as K
from keras.utils.generic_utils import get_custom_objects
def custom_activation(x):
return (K.sigmoid(x) * 5) - 1
get_custom_objects().update({''custom_activation'': Activation(custom_activation)})
# Usage
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation(custom_activation, name=''SpecialActivation''))
print(model.summary())
Tenga en cuenta que debe importar esta función cuando guarde y restaure el modelo. Ver la nota de keras-contrib .
Digamos que le gustaría agregar
swish
o
gelu
a keras, los métodos anteriores son buenas inserciones en línea.
Pero también puede insertarlos en el conjunto de funciones de activación de Keras, de modo que lo llame función personalizada como llamaría a
ReLU
.
Probé esto con keras 2.2.2 (cualquier v2 lo haría).
Agregue a este archivo
$HOME/anaconda2/lib/python2.7/site-packages/keras/activations.py
la definición de su función personalizada (puede ser diferente para su versión de python y anaconda).
En keras internas:
$HOME/anaconda2/lib/python2.7/site-packages/keras/activations.py
def swish(x):
return (K.sigmoid(beta * x) * alpha *x)
Luego, en su archivo de Python:
$HOME/Documents/neural_nets.py
model = Sequential()
model.add(Activation(''swish''))
Ligeramente más simple que la respuesta de Martin Thoma : puede crear una función de fondo personalizada basada en elementos y usarla como parámetro. Aún necesita importar esta función antes de cargar su modelo.
from keras import backend as K
def custom_activation(x):
return (K.sigmoid(x) * 5) - 1
model.add(Dense(32 , activation=custom_activation))