Пакетная форма в Keras Пользовательский метод вызова слоя - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать реализацию слоя 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) формы.

Может кто-нибудь посоветовать, как это сделать?

1 Ответ

0 голосов
/ 09 мая 2018

Мне кажется, я понял, что ты хочешь сделать. Разверните размерность self.centers и x следующим образом, и тогда произойдет неявное вещание:

def call(self, x):
    centers = self.centers[None, :, :]  # Shape=(1, 400, 11970)
    x = x[:, None, :]  # Shape=(100, 1, 11970)
    sub = centers - x  # Shape=(100, 400, 11970)
    sqr = sub * sub
    rbf = K.exp(-self.betas * K.sum(sqr, axis=-1))
    return rbf  # Shape=(100, 400)

Примечание: не тестировалось.

...