2017-11-16 1 views
0

Ich habe das folgende Netzwerk erstellt. Die Idee ist, die Ausgänge der left und right zu kombinieren und dann an ein LSTM-Modell zu senden.Keras: Layer zusammenführen/verketten: TypeError: __init __() hat mehrere Werte für das Argument 'Achse'

EMBED_DIM = 4 
look_back = 6 
feature_num = 2 
ENCODE_DIM = 676 

left = Sequential() 
left.add(Dense(EMBED_DIM,input_shape=(ENCODE_DIM,))) 
left.add(RepeatVector(look_back)) 
left.add(Reshape((look_back,EMBED_DIM))) 

right = Sequential() 
right.add(Lambda(lambda x: x,input_shape=(look_back,feature_num))) 


# create and fit the LSTM network 
model = Sequential() 
model.add(Concatenate([left, right], axis = 2,input_shape=(look_back, EMBED_DIM + feature_num))) 
model.add(LSTM(8, input_shape=(look_back,feature_num + EMBED_DIM))) 

model.add(Dense(2)) 
model.compile(loss='mean_squared_error', optimizer='adam') 

Ich versuche, die Ausgabe von links und rechts, dann senden Sie den neuen Tensor zum LSTM Modell verketten.

jedoch bekam ich folgende Fehlermeldung:


TypeError         Traceback (most recent call last) 
<ipython-input-156-275f5597cdad> in <module>() 

---> 37 model.add(Concatenate([left, right], axis = 2,input_shape=(look_back, EMBED_DIM + feature_num))) 
    38 model.add(LSTM(8, input_shape=(look_back,feature_num + EMBED_DIM))) 
    39 

TypeError: __init__() got multiple values for argument 'axis' 

Jede Idee, was ich falsch gemacht habe? Kann ich eine Concatenate Schicht als erste Schicht eines Modells hinzufügen? Vielen Dank!

Antwort

1

Sequenzielle Modelle sind nicht für Verzweigungen gedacht. Verwenden Sie das funktionale API-Modell.

ist die „Tensor“ von der linken und rechten Seite Lassen Sie erhalten:

leftOutput = left.output  
rightOutput = right.output 

Nun ist die Concatenate eine Schicht, die die gleiche Logik aller anderen Schichten folgt. (Erste Sie es schaffen, dann rufen Sie es mit dem Eingang Tensoren):

#first parentheses: create the layer/second parentheses: call the layer with inputs 
output = Concatenate(axis=2)([leftOutput,rightOutput]) 

sie hält den Rest des Modells als funktionellen API auch:

output = LSTM(8)(output) 
output = Dense(2)(output) 

Jetzt erstellen wir das Modell, sagen sie, was die Ein- und Ausgänge sind:

inputTensorLeft = left.input 
inputTensorRight = right.input  

fullModel = Model([inputTensorLeft,inputTensorRight], output) 

Hinweis Sie mit drei Modellen endete, aber einer von ihnen die anderen beiden enthält. Sie teilen die gleichen Gewichte. Trainieren wird die anderen trainieren, wenn Sie einen gemeinsamen Pfad trainieren.

+0

Danke! Aber ich möchte, dass die Gewichte in links, rechts und Modell alle zusammen in einer Iteration ausgewertet werden. h. ich möchte, dass der Fehler in der endgültigen Ausgabe sich nach links und rechts ausbreiten kann, und ihre Gewichte anpassen. Würde der obige Ansatz das tun? – Edamame

+0

Ja. Alle Gewichte sind geteilt. Trainiere das komplette Modell, welches in diesem Code 'fullModel' ist. –

+0

Vielen Dank! Wirklich hilft viel! – Edamame

Verwandte Themen