Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras自定义层调用方法中的批处理形状_Python_Keras_Theano - Fatal编程技术网

Python Keras自定义层调用方法中的批处理形状

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,

我正在尝试创建一个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中减去它,后者是有广播的(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