2017-03-11 1 views
1

Ich versuche, den word2vec Algorithmus mit Keras zu implementieren, aber ich bin immerGenannt set_weights (Gewichte) auf Schicht „I2h“ mit einer Gewichtsliste der Länge 3418, aber die Schicht erwartete 0 Gewichte

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... 

als ich versuche, die Gewichte für die gemeinsam genutzten Matrix von dem Eingang zu der verborgenen Schicht zu setzen 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') 

ich verstehe nicht ganz, wie ich diese Gewichtsmatrix einstellen.

Ich habe auch die Dense() Schicht als Eingabe verwendet wird versucht

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

aber ich bin mit dem gleichen Fehler.

Wie kann ich die geteilten Gewichte in diesem Fall einstellen?

Antwort

0

Also im Grunde - eine Dense Schicht benötigt eine Liste von zwei Gewichte Matrizen - eine für klassische Gewichte und zweite für Voreingenommenheiten. Ich nehme an, dass in Ihrem Fall Sie keine Vorurteile so brauchen:

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

sollte funktionieren.

Eine andere Sache ist, dass Keras hat eigene embedding Implementierung und ich rate Ihnen dringend, es stattdessen zu verwenden.

+0

Nun, ich verstehe nicht die 'Embedding' Klasse. Es braucht eine ganzzahlige Matrix für die Wörter, aber wenn ich das zu einer "Dichte" Ebene übergebe, erhält ich einen '(?, 6, 13)' Tensor, der für mich keinen Sinn ergibt. Was ich tun muss, ist, alle Wörter, die gegeben sind, so zusammenzufassen, dass ich den Logit-Vektor heraushole. Ich finde jedoch kein Beispiel dafür, daher bin ich damit nicht gegangen. – displayname

+0

Nur als ein Beispiel: 'h_activation = Einbetten (input_dim = vocab_size, output_dim = embedding_size, input_length = input_length, weights = [word_vectors], trainable = False) (in_x)' das Ergebnis wird ein '(?, Input_length, embedding_size) 'geformter Tensor anstelle von' (?, embedding_size) 'wobei jedes Sample die Summe aller Worteinbettungen ist. – displayname

+0

Haben Sie "Pooling" probiert? –

Verwandte Themen