【发布时间】:2018-05-08 06:31:30
【问题描述】:
我正在尝试创建 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) 形状。
有人可以建议怎么做吗?
【问题讨论】:
-
张量
x的形状为(batch_size, input_dim)。张量self.centers的形状为(output_dim, input_dim)。此处不会发生广播,因为batch_size=100和output_dim=400之间存在不匹配。我不明白你在做什么。 -
一开始假设 'batch size' 是 1。 Input_dim 是 11970 'self.centers' 是 400 行和 11970 列现在我想用广播从中心减去 x,这样 x 就重复了从每一行中减去。当我们有一个像 100 这样的批量大小时。我有点需要 'self.centers' 的 'batch_size' 副本,然后从每个副本中减去一个带有广播的单个批处理元素