Python Keras自定义层调用方法中的批处理形状
我正在尝试创建一个RBF层的实现 以下是构建方法:Python Keras自定义层调用方法中的批处理形状,python,keras,theano,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,
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中减去它,后者是有广播的(40011970)
但是我得到了x的形状(10011970),因此我马上得到了一批。现在我需要做100次减法来获得形状(10040011970)。然后在输入方向上求平方和,将其缩小为(100400)形状
有人能告诉我怎么做吗?我想我知道你想做什么。将
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)
注:未测试。Tensor
x
具有形状(批次大小,输入尺寸)
。张量self.centers
具有形状(输出尺寸,输入尺寸)
。此处不会进行广播,因为批处理大小=100
和输出大小=400
之间不匹配。我不明白你想做什么。首先假设“批量大小”为1。输入尺寸是11970‘self.centers’是400行和11970列现在我想用广播从中心减去x,这样就可以重复地从每行减去x。当我们有一个批量大小像100。我需要“self.centers”的“batch_size”副本,然后从每个副本中减去一个带有broadcastinghanks的单批元素,它确实有效。不幸的是,大小为10040011970的张量不适合我的旧GPU内存:-)不得不将批处理大小减少到12