2017-05-04 5 views
1

Ich habe zwei Klassen von Modellen definiert, x und y.Wie nehme ich die Ausgabe eines Modells als Eingabe eines anderen mit Tensorflow r-1.0?

class x(): 
    def __init__(self, x_inp1, x_inp2): 
     # do sth... 

    def step(self, session, encoder_inputs): 
     input_feed = {} 
     for l in range(encoder_size): 
      input_feed[self.encoder_inputs[l].name] = encoder_inputs[l] 
     ... 
     output_feed = [x_output] 
     return session.run(x_output) 

class y(): 
    def __init__(self, y_inp1, y_inp2): 
     # do sth... 

    def step(self, encoder_inputs): 
     input_feed = {} 
     for l in range(encoder_size): 
      input_feed[self.encoder_inputs[l].name] = encoder_inputs[l] 
     ... 

Sie haben ziemlich ähnliche Funktionen. Und dann definiere ich eine andere Klasse, um sie zu gruppieren.

class gp(): 
    def __init__(self, x_inp1, x_inp2, y_inp1, y_inp2): 
     with tf.variable_scope('x'): 
       self.x_model = x(x_inp1, x_inp2) 
     with tf.variable_scope('y'): 
       self.y_model = y(y_inp1, y_inp2) 
    def step(self, session, encoder_inputs): 
     x_output = self.x_model.step(session, encoder_inputs) 
     y_output = self.y_model.step(session, x_output) 
     ... 

Bitte beachten Sie, dass die y_model die Ausgabe von x_model als Eingabe verwendet. Und ich die gp() in der main Funktion auszuführen:

with tf.Session() as sess: 
    gp_m = gp(x_inp1, x_inp2, y_inp1, y_inp2) 
    gp_m.step(sess, x_inp1, x_inp2, y_inp1, y_inp2) 

und nach x_output = self.x_model.step(encoder_inputs) laufen und beginnen y_output = self.y_model.step(x_output) zu tun, ich habe einen solchen Fehler:

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

Bitte beachten Sie Dieser Fehler weist auf die x_model auch die Schrittfunktion davon wurde beendet. Ich frage mich, wie kann ich den Ausgang x_model als den Eingang von y_model ohne Fehler verwenden? Danke im Voraus!

Antwort

0

Sie sollten die Anrufe auf session.run aufschieben, um außerhalb der step Funktionen zu sein. Das Problem hierbei ist, dass der Versuch, Y auszuführen, X auslöst, weil sie im Graphen verbunden sind.

Stattdessen ist es möglicherweise besser, die Phasen für die Erstellung von Grafiken und die Ausführung von Grafiken vollständig zu trennen, damit Sie wissen, welche Platzhalter wann bereitgestellt werden sollen.

+0

Danke für Ihre Antwort! Aber es tut mir leid, dass ich immer noch ein wenig verwirrt bin. Ich sollte die Aufrufe von 'session.run' verschieben, um außerhalb von' step' Funktionen zu sein? Und könnten Sie mir bitte sagen, wie Sie die Grafik vollständig trennen können? Danke vielmals!!! – user5779223

+0

Erstellen Sie das Diagramm (d. H. Rufen Sie die meisten tf-Funktionen auf), geben Sie die Tensoren zurück, die Sie ausführen möchten, und rufen Sie session.run an einer anderen Stelle auf. Um einen guten Weg zu sehen, um Ihren Code zu strukturieren, versuchen Sie, tf.estimator.Estimator zu betrachten –

Verwandte Themen