keras中如何自定义激活函数

问题描述:

我正在使用keras,我想添加我自己的激活函数myf到tensorflow backend。如何定义新函数并使其可操作。
因此我不使用以下代码:

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

而是使用:

model.add(layers.Conv2D(64, (3, 3), activation='myf'))
解答:

首先,您需要使用 backend定义一个函数。 例如,这是我实现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))
参考:

How to create custom Activation functions in Keras / TensorFlow?

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值