Keras自定义图层调用方法

时间:2018-05-08 06:31:30

标签: python keras theano

我正在尝试创建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 :(得分:0)

我想我明白你想做什么。如下展开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)

注意:未经测试。