编辑看底部我是如何解决这个问题的

我编写了自己的Keras图层,其构建方法如下:

class Multed_Weights(Layer):

def __init__(self, input_dim, output_dim, **kwargs):
    self.output_dim = output_dim
    self.input_dim = input_dim

    super(Multed_Weights, self).__init__(**kwargs)

def build(self, input_shape):
    # Create a trainable weight variable for this layer.
    self.kernel = self.add_weight(name='kernel',
                                  shape=(self.input_dim, self.output_dim),
                                  initializer=RandomNormal(mean=0., stddev = 0.05, seed = None),
                                  trainable=True)
    super(Multed_Weights, self).build(input_shape)  # Be sure to call this somewhere!
    print("mult kernel has shape " + str(K.int_shape(self.kernel)))

def call(self, x, **kwargs):
    return Dot(axes = [1,0])([x, self.kernel])

def compute_output_shape(self, input_shape):
    output_shape = (None, self.output_dim)
    print("the output shape of multed weights is "+ str(output_shape))
    return output_shape

在这里's what I'我试图做 . 在https://arxiv.org/pdf/1503.08895.pdf之后(见第2页上面的引文(3))我修复了我之前的问题,但现在又有了另一个问题 .

“InvalidArgumentError(参见上面的追溯):不兼容的形状:[150,128]与[150,10000] [[节点:训练/ SGD /梯度/ multed__weights_1 / dot_2 / Mul_grad / BroadcastGradientArgs = BroadcastGradientArgs [T = DT_INT32,class = [” loc:@ multed__weights_1 / dot_2 / Mul“], device =”/ job:localhost / replica:0 / task:0 / device:CPU:0“](training / SGD / gradient / multed__weights_1 / dot_2 / Mul_grad / Shape,training / SGD /梯度/ multed__weights_1 / dot_2 / Mul_grad / Shape_1)]]”

所以它仍然是这个类引起了问题 . 我的批量大小是128,所以似乎错误来自这个没有批量大小的权重矩阵 . 但它不会让我用shape =(None,...,...)创建它所以我不知道该怎么做 .

更新我太注重在这一层中拥有动态批量大小 . 一旦我将形状硬编码为(128,self.input_dim,self.output_dim),提前知道我的批量大小是128,它工作正常 . 虽然,我意识到这种方法在128个批次中的每一个都会有不同的权重,所以也许我应该像以前一样设置形状然后再做RepeatVector 128次 . 我怀疑128中的每一个都将包含相同权重的引用,而不是创建新的权重,但我不确定 .