Я строю NN, который поддерживает комплексные числа. В данный момент работаю над комплексной активацией. По словам Бенджио, это хороший документ:

Где b - обучаемый параметр, который нужно выучить . Поэтому я создаю специальный слой для этой активации. Я новичок в Керасе и уже застрял. Я создал этот код ниже, но он дает ошибку с функцией сборки. Я понятия не имею, что происходит, я просто попытался скопировать шаблон. Пожалуйста, помогите.
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 я ничего не добавил, потому что это слой активации, который не требует ввода при создании экземпляра.
В методе сборки я попытался добавить буквы b. Не уверен, стоит ли мне использовать метод self.add_weight. В идеале, я хочу иметь столько же b, сколько и размер входных данных.
В этом методе вызова я почти уверен, что делаю. Это просто, я только что реализовал функцию.
Последний, 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