Я пытаюсь создать реализацию слоя RBF.
Вот метод сборки:
def build(self, input_shape):
self.centers = self.add_weight(name='centers',
shape=(self.output_dim, input_shape[1]),
initializer=self.initializer,
trainable=True)
self.betas = self.add_weight(name='betas',
shape=(self.output_dim,),
initializer=Constant(value=self.init_betas),
trainable=True)
super(RBFLayer, self).build(input_shape)
Вот звонок:
def call(self, x):
sub = self.centers - x # centers shape (400, 11970), x shape (100, 11970)
sqr = sub * sub
rbf = K.exp(-self.betas * K.sum(sqr, axis=1))
return rbf # must have size (100, 400)
Размер ввода 11970
Размер слоя 400
Размер партии составляет 100
Моя проблема в том, что я ожидал, что переменная x в методе вызова будет иметь форму (Нет, 11970), чтобы я мог вычесть ее из self.centers , которая является ( 400, 11970) с трансляцией.
Но я получаю x формы (100, 11970), поэтому я получаю партию сразу. И теперь мне нужно как-то сделать 100 вычитаний, чтобы получить форму (100, 400, 11970). Затем возведите в квадрат и суммируйте в направлении ввода, чтобы уменьшить его до (100, 400) формы.
Может кто-нибудь посоветовать, как это сделать?