如何使用Keras创建自定义激活功能?

时间:2017-05-11 12:30:20

标签: python keras keras-layer

有时像ReLU,tanh,softmax,......和standard activations这样的默认advanced activations是不够的。它也可能不在keras-contrib

如何创建自己的激活功能?

4 个答案:

答案 0 :(得分:34)

this Github issue comment by Ritchie Ng的信用。

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

model.add(Activation(custom_activation))

请记住,在保存和恢复模型时必须导入此功能。请参阅the note of keras-contrib

答案 1 :(得分:5)

Martin Thoma's answer简单一点:您可以仅创建一个自定义的元素后端函数并将其用作参数。在加载模型之前,您仍然需要导入此功能。

from keras import backend as K

def custom_activation(x):
    return (K.sigmoid(x) * 5) - 1

model.add(Dense(32 , activation=custom_activation))

答案 2 :(得分:2)

假设您要向keras添加swishgelu,以前的方法是很好的内联插入。但是,您也可以将其插入到keras激活函数集中,以便像调用ReLU一样调用自定义功能。我使用keras 2.2.2进行了测试(任何v2都可以)。在此文件$HOME/anaconda2/lib/python2.7/site-packages/keras/activations.py上添加自定义函数的定义(对于您的python和anaconda版本,可以不同。)

在keras内部:

$HOME/anaconda2/lib/python2.7/site-packages/keras/activations.py

def swish(x):
    return (K.sigmoid(beta * x) * alpha *x)

然后在您的python文件中:

$HOME/Documents/neural_nets.py

model = Sequential()
model.add(Activation('swish'))

答案 3 :(得分:0)

您可以使用 lambda 关键字或 Lambda 层。假设你的神经网络没有激活给出了一堆5

import tensorflow as tf
import numpy as np

x = np.ones((5, 5))

model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, kernel_initializer=tf.initializers.Ones)
])

model.build(input_shape=x.shape)

model(x)
<tf.Tensor: shape=(5, 1), dtype=float32, numpy=
array([[5.],
       [5.],
       [5.],
       [5.],
       [5.]], dtype=float32)>

并且您希望激活函数除以 5。您可以添加一个 Lambda 层:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, kernel_initializer=tf.initializers.Ones),
    tf.keras.layers.Lambda(lambda x: x/5)
])
<tf.Tensor: shape=(5, 1), dtype=float32, numpy=
array([[1.],
       [1.],
       [1.],
       [1.],
       [1.]], dtype=float32)>

或者在 activation 参数中使用 lambda 关键字:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, 
                          kernel_initializer=tf.initializers.Ones, 
                          activation=lambda x: x/5)
])
<tf.Tensor: shape=(5, 1), dtype=float32, numpy=
array([[1.],
       [1.],
       [1.],
       [1.],
       [1.]], dtype=float32)>