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.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)
注:未测试。
我正在尝试创建 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.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)
注:未测试。