我对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)
答案 0 :(得分:0)
几件事:
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()
方法在h1
和h2
与内核之间执行逐元素乘法,将这两个部分加在一起。基本上是相同的成本函数,每个功能都具有唯一的alpha
。
您可能需要进行一些调试,因为我没有运行它的示例。
这是writing your own layers上文档的链接,您似乎已经有了,但为完整起见,此处包括在内。