2016-06-29 12 views
0

Ich habe einen REST-Webservice erstellt, um die maschinelle Übersetzung mit einigen Änderungen in translate.py auszuführen. Wenn ich die decode-Funktion nur in translate.py ausführe, bekomme ich bei mehreren Läufen die richtige Ausgabe. Aber wenn ich versuche, die Dekodierungsfunktion über den Webservice auszuführen, den ich erstellt habe, bekomme ich das Übersetzungsergebnis zum ersten Mal. Aber in der zweiten Iteration wird ein Fehler im Titel erwähnt.Wie löst man den ValueError proj_w in Tensorflow auf?

Dies ist die Fehlermeldung, die ich bekomme: ValueError: Variable proj_w existiert bereits, nicht erlaubt. meinst du, reuse = true in VarScope zu setzen?

REST-Webservice Teil:

input = request.json['inputtext'] 
print "'%s'" % input 
print 'Please wait' 
#import pdb; pdb.set_trace() 
#out = demo1.decode(input); 

Decode Python-Skript:

def decode(sentence) 

with tf.Session() as sess: 
# Create model and load parameters. 

model = create_model(sess, True) 
model.batch_size = 1 # We decode one sentence at a time. 

# Load vocabularies. 
en_vocab_path = os.path.join(FLAGS.data_dir, 
          "vocab%d.en" % FLAGS.en_vocab_size) 
fr_vocab_path = os.path.join(FLAGS.data_dir, 
          "vocab%d.fr" % FLAGS.fr_vocab_size) 
en_vocab, _ = data_utils.initialize_vocabulary(en_vocab_path) 
_, rev_fr_vocab = data_utils.initialize_vocabulary(fr_vocab_path) 

# Decode from standard input. 
#sys.stdout.write("> ") 
#sys.stdout.flush() 
#sentence = sys.stdin.readline() 
print ("reading line %s" % sentence) 

token_ids = data_utils.sentence_to_token_ids(tf.compat.as_bytes(sentence), en_vocab) 
bucket_id = min([b for b in xrange(len(_buckets)) 
        if _buckets[b][0] > len(token_ids)]) 
encoder_inputs, decoder_inputs, target_weights = model.get_batch(
     {bucket_id: [(token_ids, [])]}, bucket_id) 

_, _, output_logits = model.step(sess, encoder_inputs, decoder_inputs, 
            target_weights, bucket_id, True) 
outputs = [int(np.argmax(logit, axis=1)) for logit in output_logits] 
if data_utils.EOS_ID in outputs: 
    outputs = outputs[:outputs.index(data_utils.EOS_ID)] 
#print(" ".join([tf.compat.as_str(rev_fr_vocab[output]) for output in outputs])) 
str1 = ([tf.compat.as_str(rev_fr_vocab[output]) for output in outputs]) 
output = ' '.join(str1) 

print ("output line %s\n" % output) 
sys.stdout.flush() 
sess.close() 
return output 

es das erste Mal funktioniert. Aber für den nächsten Schlag auf den Webservice, bekomme ich diesen Fehler „Valueerror:.? Variable proj_w bereits vorhanden ist, nicht anerkannt hat meinen Sie Wiederverwendung = true in VarScope setzen

+0

Im Allgemeinen möchten Sie Ihr Modell * einmal * erstellen und über sess.run() mehrmals aufrufen. Nach einem kurzen Überfliegen des Codes sieht es so aus, als ob Sie versuchen, das Modell bei jedem Aufruf von decode() neu zu erstellen. –

+0

Sie haben Recht. Ich habe das Modell für jeden Anruf erstellt. Ich habe es jetzt geändert und es scheint jetzt gut zu funktionieren. –

Antwort

1

Mit den folgenden Modifikationen, ich bin in der Lage zu Führen Sie den Webservice reibungslos aus. Ich erstelle das Modell und tf.session() nur einmal. Früher wurden sie für jeden Treffer im Webservice erstellt.