我正在尝试创建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)形状。
有人可以建议怎么做吗?
答案 0 :(得分:0)
我想我明白你想做什么。如下展开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)
注意:未经测试。