编辑查看我修复此内容的底部
我已经编写了自己的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(参见第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 / gradient / multed__weights_1 / dot_2 / Mul_grad / Shape_1 )]]"
所以这个课仍然导致了这个问题。我的批量大小是128,所以似乎错误来自这个没有批量大小的权重矩阵。但它不会让我用shape =(无,...,......)创建它,所以我不知道该怎么做。
update 我过于注重在这一层中拥有动态批量大小。一旦我将形状硬编码为(128,self.input_dim,self.output_dim),提前知道我的批量大小是128,它工作正常。虽然,我意识到这种方法在128个批次中的每一个都会有不同的权重,所以也许我应该像以前一样设置形状然后再做RepeatVector 128次。我怀疑128中的每一个都会包含相同权重的引用,而不是制作新的权重,但我不确定。