2017-04-05 4 views
1

Unten ist die vereinfachte Version des Problems, das ich habe.Masking Nullen in Keras Einbettschicht

Beispieldaten:

X = np.round(np.random.rand(10, 10) * 10).astype(np.int32) 
y = np.round(np.random.rand(10)).astype(np.int32) 

Modell:

i = Input(shape=(10,), name='sentence_input', dtype='int32') 
x = Embedding(1000, 10, mask_zero=True)(i) 
o = LSTM(10)(x) 
enc_model = Model(i, o) 

i2 = Input(shape=(10,), dtype='int32') 
x2 = enc_model(i2) 
o2 = Dense(1, activation='sigmoid')(x2) 

model = Model(i2, o2) 
model.compile(optimizer='rmsprop', loss='binary_crossentropy') 
model.fit(X, y, epochs=1) 

Ich verwende Tensorflow 1.0.1 als Keras Backend. Keras Version 2.0.

ich Maskierung hinzufügen möchten, aber in dem Moment mask_zero=True hinzugefügt wird, schlägt es mit Fehler:

InvalidArgumentError: You must feed a value for placeholder tensor 'sentence_input_10' with dtype int32 
[[Node: sentence_input_10 = Placeholder[dtype=DT_INT32, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

ich aber das Hinzufügen dtype='int32' auf beiden Input Schichten wird das Problem beheben.

brauche ich enc_model als separate Model

Antwort

0

Ich denke, Ihre input_dim von 1000 haben, ist zu groß, müssen Sie nicht nur 10 Werte als Eingabe haben?
Also sollte es 12 sein (weil Sie mask_zero = True verwenden).

mask_zero: Whether or not the input value 0 is a special "padding" value that should be masked out. This is useful when using recurrent layers which may take variable length input. If this is True then all subsequent layers in the model need to support masking or an exception will be raised. If mask_zero is set to True, as a consequence, index 0 cannot be used in the vocabulary (input_dim should equal |vocabulary| + 2).

+0

Ich bin mir der Regel | vocal | +2 bewusst, aber hier ändert sich nichts. Ich habe ein Beispiel gegeben, das leicht genug ist, damit jeder auf seinem Computer ausführen/experimentieren kann (vorausgesetzt, Sie verwenden Keras 2 und TF 1.0. *). Wenn Sie 1000 zu 12 ändern, ist der Fehler immer noch vorhanden. Übrigens. Ich vermute, dass es sich um einen Keras-Bug handelt, wollte aber nur sicherstellen, dass ich nichts falsch mache. – bartgras

+0

Ich versuchte es ein bisschen herum und es scheint, dass das Problem ist, dass Sie ein Modell als eine Schicht verwenden möchten, die nicht funktioniert. Wenn Sie die Schichten Ihres ersten Modells in die zweite integrieren, scheinen die Schichten nicht das Problem zu sein. Kann ich fragen, warum Sie getrennte Modelle benötigen? Eine Lösung wäre vielleicht, Ihre eigene Keras-Ebene zu schreiben und diese im zweiten Modell zu verwenden. – Paul

+0

Ich brauche es getrennt, weil mein enc_model in 2 separaten Eingängen wiederverwendet wird, die die gleichen Gewichte teilen müssen. Bevor ich versucht habe, es mit Sequential neu zu schreiben, gibt es immer noch den gleichen Fehler. Der Code basiert auf https://keras.io/getting-started/functional-api-guide/, Beispielcode-Snippet namens "Shared Vision Model". Ich mache genau das gleiche und es funktioniert bis Maskierung hinzugefügt wird. – bartgras