【问题标题】:Custom activation with parameter带参数的自定义激活
【发布时间】:2019-04-02 16:14:53
【问题描述】:

我正在尝试在 Keras 中创建一个激活函数,它可以接收参数 beta,如下所示:

from keras import backend as K
from keras.utils.generic_utils import get_custom_objects
from keras.layers import Activation

class Swish(Activation):

    def __init__(self, activation, beta, **kwargs):
        super(Swish, self).__init__(activation, **kwargs)
        self.__name__ = 'swish'
        self.beta = beta


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

get_custom_objects().update({'swish': Swish(swish, beta=1.)})

如果没有beta 参数,它运行良好,但是如何在激活定义中包含该参数?我还希望在执行model.to_json() 时保存此值,例如激活 ELU。


更新:我根据@today 的回答编写了以下代码:

from keras.layers import Layer
from keras import backend as K

class Swish(Layer):
    def __init__(self, beta, **kwargs):
        super(Swish, self).__init__(**kwargs)
        self.beta = K.cast_to_floatx(beta)
        self.__name__ = 'swish'

    def call(self, inputs):
        return K.sigmoid(self.beta * inputs) * inputs

    def get_config(self):
        config = {'beta': float(self.beta)}
        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

from keras.utils.generic_utils import get_custom_objects
get_custom_objects().update({'swish': Swish(beta=1.)})
gnn = keras.models.load_model("Model.h5")
arch = gnn.to_json()
with open(directory + 'architecture.json', 'w') as arch_file:
    arch_file.write(arch)

但是,它当前不会将beta 值保存在 .json 文件中。我怎样才能让它保存价值?

【问题讨论】:

    标签: python machine-learning keras keras-layer activation-function


    【解决方案1】:

    由于要在序列化模型的时候保存激活函数的参数,所以我认为最好将激活函数定义为像advanced activations which have been defined in Keras这样的层。你可以这样做:

    from keras.layers import Layer
    from keras import backend as K
    
    class Swish(Layer):
        def __init__(self, beta, **kwargs):
            super(Swish, self).__init__(**kwargs)
            self.beta = K.cast_to_floatx(beta)
    
        def call(self, inputs):
            return K.sigmoid(self.beta * inputs) * inputs
    
        def get_config(self):
            config = {'beta': float(self.beta)}
            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
    

    然后你可以像使用 Keras 层一样使用它:

    # ...
    model.add(Swish(beta=0.3))
    

    由于在其定义中实现了get_config() 方法,因此在使用to_json()save() 等方法时将保存参数beta

    【讨论】:

    • 这是我做的但是参数值没有保存在json文件中
    • @user7867665 你确定你已经实现了get_config() 方法并在其中包含beta 参数吗?
    • 我做的不一样,我现在正在测试你的实现
    • 它不会在 .json 文件中保存 beta 值,我完全使用了你的代码
    • @user7867665 确实很奇怪!这个对我有用。您能否将您的代码放入github gist(或任何其他提供可共享链接的在线笔记共享网站)并将链接提供给我?
    猜你喜欢
    • 2019-01-31
    • 2018-04-15
    • 2018-09-30
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多