Python 自定义激活函数的可训练参数向量

Python 自定义激活函数的可训练参数向量,python,parameters,keras,activation,Python,Parameters,Keras,Activation,我对Keras有点陌生,我正在尝试用一个自定义的激活函数运行一些实验,该函数有一个可训练的参数。我已经创建了下面的代码,它本质上是ReLU激活函数的变体。目前,它计算alpha*h1+(1-alpha)*h2,其中h1=relu(x)和h2=relu(-x),希望能帮助常规relu功能产生的死亡神经元。我想知道是否有可能修改这个代码,生成一个可训练参数向量,以进一步测试这个想法,而不是仅仅拥有一个可训练参数alpha。如有任何建议或帮助,将不胜感激 class CustomLayer(Layer

我对Keras有点陌生,我正在尝试用一个自定义的激活函数运行一些实验,该函数有一个可训练的参数。我已经创建了下面的代码,它本质上是ReLU激活函数的变体。目前,它计算
alpha*h1+(1-alpha)*h2
,其中
h1=relu(x)
h2=relu(-x)
,希望能帮助常规relu功能产生的死亡神经元。我想知道是否有可能修改这个代码,生成一个可训练参数向量,以进一步测试这个想法,而不是仅仅拥有一个可训练参数
alpha
。如有任何建议或帮助,将不胜感激

class CustomLayer(Layer):
  def __init__(self, alpha, **kwargs):
    self.alpha = alpha
    super(CustomLayer, self).__init__(**kwargs)

  def build(self, input_shape):
    self.kernel = self.add_weight(name='kernel', 
                                  shape=(input_shape[1], self.alpha),
                                  initializer='uniform',
                                  trainable=True)
    super(CustomLayer, self).build(input_shape)

  def call(self,x):
    h1 = K.relu(x)
    h2 = K.relu(-x)
    return self.kernal*h1 + (1 - self.kernal)*h2

  def compute_output_shape(self, input_shape):
    return (input_shape[0], self.alpha)
有几件事:

  • 您当前正在使用
    alpha
    设置网络的输出形状,这几乎肯定是不正确的
  • 您可以为您的层定义内核,使其大小与您尝试执行的操作相符。这是您想要为激活功能创建可训练参数的地方
  • 由于这是一个激活函数,您可能希望输出与输入的形状相同
尝试以下方法:

from keras import backend as K

class CustomLayer(Layer):
    # You actually don't need to redefine __init__ since we don't need to
    # pass any custom parameters. I'm leaving it here to show that it changed
    # from your example.
    def __init__(self, **kwargs):
        super(CustomLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1], 1),
                                      initializer='uniform',
                                      trainable=True)
        super(CustomLayer, self).build(input_shape)

    def call(self, x):
        h1 = K.relu(x)
        h2 = K.relu(-x)
        return h1*self.kernal + h2*(1 - self.kernel)

    def compute_output_shape(self, input_shape):
        return input_shape
我假设您希望为输入向量中的每个特征使用不同的
alpha
参数,这是我在
build()
方法中创建的。我还假设
input\u shape=[batch\u size,num\u features]
或类似的东西。
call()
方法执行
h1
h2
与内核之间的元素相乘,将两部分相加。基本上相同的成本函数,每个功能都有唯一的
alpha

您可能需要为此进行一点调试,因为我没有运行它的示例


这是指向上的文档的链接,您似乎已经拥有了该链接,但为了完整起见,我在这里添加了该链接。

我想我已修复了代码中的缩进,但请查看并确保。另外,在这里发布代码时需要注意的一点是:缩进在Python中很重要;检查它是否正确。
shape=(…,self.alpha)
有意义吗?Shape需要一个整数元组,我不觉得这是
alpha
应该使用的。@engineer谢谢,缩进现在是正确的。还有,关于你的另一个问题。我试图模仿他们在Keras网站上所做的,但可能实施了错误的操作。是的,在示例中,将输入链接到图层仍然是一个维度,因此将其传递到
shape
参数是有意义的。在这种情况下,这没有意义,因为
alpha
是一个(可能是浮点)参数,而不是描述数据形状的东西。