编辑看底部我是如何解决这个问题的
我编写了自己的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中的每一个都将包含相同权重的引用,而不是创建新的权重,但我不确定 .