【问题标题】:Vector of trainable parameters for custom activation function自定义激活函数的可训练参数向量
【发布时间】:2019-09-25 08:32:28
【问题描述】:

我是 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)

【问题讨论】:

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

标签: python parameters keras activation


【解决方案1】:

有几点:

  • 您当前正在使用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_shape = [batch_size, num_features] 或类似的东西。 call() 方法在h1h2 与内核之间执行逐元素乘法,将两半相加。基本上相同的成本函数,每个特征都有一个唯一的alpha

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

这是writing your own layers 上文档的链接,您似乎已经拥有该链接,但为了完整起见,我将其包含在此处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2021-08-24
    • 1970-01-01
    • 2018-04-15
    • 2018-09-30
    相关资源
    最近更新 更多