在层“i2h”上调用set_weights(权重),权重列表长度为3418,但该层期望为0权重

时间:2017-03-11 12:24:16

标签: keras

我正在尝试用Keras实现word2vec算法,但我得到了

ValueError: You called `set_weights(weights)` on layer "i2h" with a  weight list of length 3418, but the layer was expecting 2 weights. Provided weights: [[ 0.07142857  0.07142857  0.07142857 ...,  0.0714...

当我尝试设置从输入到隐藏层i2h的共享矩阵的权重时:

class Word2Vec:

    def __init__(self, window_size, word_vectors):

        vocab_size = word_vectors.shape[0]
        embedding_size = word_vectors.shape[1]

        i2h = Dense(embedding_size, activation='linear', name='i2h')

        inputs = list()
        h_activations = list()

        for i in range(window_size):

            in_x = Input(shape=(vocab_size, 1), name='in_{:d}'.format(i))
            inputs.append(in_x)
            h_activation = i2h(in_x)
            h_activations.append(h_activation)

        i2h.set_weights(word_vectors)

        h = merge(h_activations, mode='ave')

        h2out = Dense(vocab_size, activation='softmax', name='out')(h)

        self.model = Model(input=inputs, output=[h2out])
        self.model.compile(optimizer='adam', loss='mse')

我不太明白如何设置这个权重矩阵。

我还尝试使用Dense()图层作为输入

i2h = Dense(embedding_size, input_dim=vocab_size, activation='linear', name='i2h')
i2h.set_weights(word_vectors)

但我收到同样的错误。

在这种情况下如何设置共享权重?

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,发现解决方案是先将图层添加到现有模型中,然后调用set_weights。因此,对于您的示例,我建议将行i2h.set_weights(word_vectors)移到行self.model = Model(input=inputs, output=[h2out])

之后

答案 1 :(得分:0)

基本上 - Dense层需要两个权重矩阵的列表 - 一个用于经典权重,第二个用于偏差。我假设在你的情况下你不需要偏见,所以:

i2h.set_weights([word_vectors, numpy.zeros((embedding_size,))])

应该有效。

另一件事是Keras有自己的embedding实施,我强烈建议您改用它。