edit请参阅底部以了解我如何解决此问题
我写了自己的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
这就是我正在尝试做的事情。下列的https://arxiv.org/pdf/1503.08895.pdf https://arxiv.org/pdf/1503.08895.pdf(参见第 2 页上面的引文 (3))我解决了之前的问题,但现在我遇到了另一个问题。
“InvalidArgumentError(请参阅上面的回溯):不兼容的形状:[150,128] 与 [150,10000]
[[节点:训练/SGD/gradients/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 /任务:0/设备:CPU:0“](训练/SGD/梯度/multed__weights_1/dot_2/Mul_grad/形状,训练/SGD/梯度/multed__weights_1/dot_2/Mul_grad/Shape_1)]]”
所以问题仍然是这个类造成的。我的批量大小是 128,所以看来错误来自这个没有批量大小的权重矩阵。但它不允许我用 shape=(None, ... , ...) 创建它,所以我不知道该怎么做。
update我太关注这一层的动态批量大小。一旦我将形状硬编码为 (128, self.input_dim, self.output_dim),提前知道我的批量大小是 128,它就工作得很好。尽管如此,我意识到这个方法在 128 个批次中的每一个批次中都会有不同的权重,所以也许我应该像以前一样设置形状,然后执行 RepeatVector 128 次。我怀疑 128 个中的每一个都会包含对相同权重的引用,而不是创建新的权重,但我不确定。