Keras Custom layer调用方法中的batch shape

Batch shape in Keras Custom layer call method

我正在尝试创建 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 变量的形状为 (None, 11970),这样我就可以从 self.centers 即 (400, 11970) 带广播。

但我得到 x 的形状 (100, 11970),因此我一次得到了一批。现在我需要以某种方式进行 100 次减法以获得形状 (100, 400, 11970)。然后在输入方向上平方求和,将其缩小为(100, 400)形状。

有人可以建议怎么做吗?

我想我明白你想做什么了。将self.centersx的维度展开如下,然后会出现隐式广播:

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)

注:未测试。