创建可训练重量的Keras层

时间:2018-05-03 00:22:37

标签: parameters deep-learning keras layer

编辑查看我修复此内容的底部

我已经编写了自己的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中的每一个都会包含相同权重的引用,而不是制作新的权重,但我不确定。

0 个答案:

没有答案