我正在尝试用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)
但我收到同样的错误。
在这种情况下如何设置共享权重?
答案 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实施,我强烈建议您改用它。