Как создать пользовательскую функцию активации с помощью 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'))
Другие вопросы по тегам