我正在构建一个支持复数的神经网络。目前正在研究复数激活函数。根据Benjio的一篇论文,这是一个不错的选择:
b是一个可训练的参数,因此我正在构建一个特殊的层来执行此激活。我对Keras不熟悉,已经卡住了。我创建了下面的代码,但在build函数中出现错误。我不知道发生了什么事情,只是尝试复制模板。请帮忙。
class modrelu(Layer):
def __init__(self, **kwargs):
super(modrelu, self).__init__(**kwargs)
def build(self):
self.b= K.variable(value=np.random.rand()-0.5, dtype='float64')
super(modrelu, self).build() # Be sure to call this at the end
def call(self, x):
assert isinstance(x, list)
ip_r, ip_i = x
comp= tf.complex(ip_r, ip_i )
ABS= tf.math.abs(comp)
ANG= tf.math.angle(comp)
ABS= K.relu( self.b + ABS)
op_r= ABS * K.sin(angle) #K.dot ??
op_i= ABS * K.cos(angle)
return [op_r, op_i]
def compute_output_shape(self, input_shape):
assert isinstance(input_shape, list)
shape_a, shape_b = input_shape
return [shape_a, shape_b]
对我的代码的评论: 在init中,我没有添加任何内容,因为它是一个激活层,在实例化时不需要输入。
在build方法中,我尝试添加b。不确定是否应该使用self.add_weight方法。理想情况下,我希望有与输入维度相同的b。
在call方法中,这个方法,我很确定我在做什么。这很容易,我只是实现了函数。
最后一个,compute_output_shape,我只是复制粘贴了模板。输出应该与输入相同,因为它只是一个激活层。
最后,这个错误值得一提,我知道它是无意义的。
TypeError Traceback (most recent call last)
<ipython-input-5-3101a9226da5> in <module>
1 a=K.variable(np.array([1,2]))
2 b=K.variable(np.array([3,4]))
----> 3 act([a,b])
~\AppData\Local\conda\conda\envs\python36\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs)
429 'You can build it manually via: '
430 '`layer.build(batch_input_shape)`')
--> 431 self.build(unpack_singleton(input_shapes))
432 self.built = True
433
TypeError: build() takes 1 positional argument but 2 were given
input_shape
在build
中传递参数。 - Anakin