Как создать пользовательскую функцию активации с помощью Keras?
Иногда стандартных стандартных активаций, таких как ReLU, tanh, softmax, ... и расширенных активаций, таких как LeakyReLU, недостаточно. И это также может быть не в keras-contrib.
Как вы создаете свою собственную функцию активации?
4 ответа
Авторы этого комментария к выпуску Github от 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))
Помните, что вам нужно импортировать эту функцию при сохранении и восстановлении модели. Смотрите примечание keras-contrib.
Немного проще, чем ответ Мартина Тома: вы можете просто создать собственную элементную бэкэнд-функцию и использовать ее в качестве параметра. Вам все еще нужно импортировать эту функцию перед загрузкой вашей модели.
from keras import backend as K
def custom_activation(x):
return (K.sigmoid(x) * 5) - 1
model.add(Dense(32 , activation=custom_activation))
Вы можете использовать
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)
])
Или используйте ключевое слово лямбда в
activation
аргумент:
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)>
Допустим, вы хотели бы добавить swish
или же gelu
для keras предыдущие методы - это хорошие встроенные вставки. Но вы также можете вставить их в набор функций активации keras, чтобы вызывать пользовательские функции, как при вызове ReLU
, Я проверил это с помощью keras 2.2.2 (подойдет любой v2). Добавить к этому файлу $HOME/anaconda2/lib/python2.7/site-packages/keras/activations.py
определение вашей пользовательской функции (может отличаться для вас в версиях Python и Anaconda).
В керасе внутреннее:
$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'))