【问题标题】:Batch shape in Keras Custom layer call methodKeras自定义图层调用方法中的批量形状
【发布时间】: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' 副本,然后从每个副本中减去一个带有广播的单个批处理元素

标签: python keras theano


【解决方案1】:

我想我明白你想要做什么。将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)

注意:未经测试。

【讨论】:

  • 谢谢,它确实有效。不幸的是,大小为 100,400,11970 的张量不适合我的旧 GPU 内存 :-) 不得不将批量大小减少到 12
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多