如何在 Keras / TensorFlow 中创建自定义激活函数?

数据挖掘 喀拉斯 张量流 激活函数
2021-10-09 02:20:00

我正在使用 keras,我想将我自己的激活函数 myf 添加到 tensorflow 后端。如何定义新功能并使其可操作。所以而不是代码行:

model.add(layers.Conv2D(64, (3, 3), activation='relu')) 

我会写

model.add(layers.Conv2D(64, (3, 3), activation='myf')). 
3个回答

首先,您需要使用后端函数定义一个函数。例如,这是我实现 swish 激活函数的方式:

from keras import backend as K

def swish(x, beta=1.0):
    return x * K.sigmoid(beta * x)

这允许您将激活函数添加到模型中,如下所示:

model.add(Conv2D(64, (3, 3)))
model.add(Activation(swish))

如果您想使用字符串作为自定义函数的别名,则必须使用 Keras 注册自定义对象。可以这样做:

from keras.utils.generic_utils import get_custom_objects

get_custom_objects().update({'swish': Activation(swish)})

这允许您按名称直接将激活添加到层:

model.add(Conv2D(64, (3, 3), activation='swish'))

对于更高级的激活函数,具有可训练的参数等,最好将它们实现为 Keras 层。这里 swish 函数在一个层中使用,允许在训练时学习 beta:

from keras.layers import Layer

class Swish(Layer):

    def __init__(self, beta=1.0, trainable=False, **kwargs):
        super(Swish, self).__init__(**kwargs)
        self.supports_masking = True
        self.beta = beta
        self.trainable = trainable

    def build(self, input_shape):
        self.beta_factor = K.variable(self.beta,
                                      dtype=K.floatx(),
                                      name='beta_factor')
        if self.trainable:
            self._trainable_weights.append(self.beta_factor)

        super(Swish, self).build(input_shape)

    def call(self, inputs, mask=None):
        return swish(inputs, self.beta_factor)

    def get_config(self):
        config = {'beta': self.get_weights()[0] if self.trainable else self.beta,
                  'trainable': self.trainable}
        base_config = super(Swish, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

    def compute_output_shape(self, input_shape):
        return input_shape

然后,您将添加与任何其他层相同的激活函数:

model.add(Conv2D(64, (3, 3)))
model.add(Swish(beta=1.0, trainable=True))

诀窍是使用backendKeras 的功能:

from keras import backend as K

def my_function(x):
    x = K.some_function(x)
    return x

其中“ some_function”是您需要的。你能详细说明一下吗?

然后你只需调用它:

model.add(Dense(10, activation = my_function))

您要实施什么激活?

  • 简单的方法:
from keras.layers.core import Activation
from keras.models import Sequential

import keras.backend as K


def myCustomActivation(x):
    return ...

model = Sequential()

model.add(Dense(120))
model.add(Activation(myCustomActivation))

model.add(Dense(30, activation= myCustomActivation))

...

myCustomActivation对于您使用 Keras 后端执行的所有操作,以便在 DAG 上执行操作。

或者

  • “不太容易”的方式:

激活只是一个微不足道的层,因此您可以按照此处的说明将自定义激活定义为自定义层

对于该call方法中编写的所有操作,请使用 keras 后端(再次在 DAG 上完成所有操作)。