2017-05-06 4 views
1

Ich baue eine kleine Flask-App, die ein konvolutionelles neurales Netz hinter den Kulissen verwendet, um Vorhersagen über vom Benutzer hochgeladene Bilder zu treffen. Es funktioniert, wenn ich es wie folgt laden:Laden eines riesigen Keras-Modells in eine Flasch-App

@app.route("/uploader", methods=["GET","POST"]) 
def get_image(): 
    if request.method == 'POST': 
     f = request.files['file'] 
     sfname = 'static/'+str(secure_filename(f.filename)) 
     f.save(sfname) 
     clf = catdog.classifier() 
     return render_template('result.html', pred = clf.predict(sfname), imgpath = sfname) 

Dies erfordert jedoch die der Klassifikator (CLF) geladen werden, nachdem der Benutzer das Bild hinzufügt. Dies dauert eine Weile, da es erfordert, dass alle Gewichtungen für ein neuronales Netzwerk mit 200+ Schichten aus einer Pickle-Datei eingerichtet werden.

Ich möchte alle Gewichte laden, wenn die App erstellt wird. Um dies zu tun, habe ich versucht, diesen (Ausschneiden unabhängigen Code für HTML-Templates/Importe/App-Start):

# put model into memory on spawn 
clf = catdog.classifier() 
# Initialize the app 
app = flask.Flask(__name__) 

@app.route("/uploader", methods=["GET","POST"]) 
def get_image(): 
    if request.method == 'POST': 
     f = request.files['file'] 
     sfname = 'static/'+str(secure_filename(f.filename)) 
     f.save(sfname) 
     return render_template('result.html', pred = clf.predict(sfname), imgpath = sfname) 

Wenn ich das tue, erhalte ich diese Zurückverfolgungs (Überspringen alle Kolben spezifische Spuren an der Spitze): als ein globales Objekt

File "/Users/zachariahmiller/Documents/Metis/test_area/flask_catdog/flask_backend.py", line 26, in get_image 
    return render_template('result.html', pred = clf.predict(sfname), imgpath = sfname) 
    File "/Users/zachariahmiller/Documents/Metis/test_area/flask_catdog/catdog.py", line 56, in predict 
    prediction = self.model.predict(img_to_predict, batch_size=1, verbose=1) 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/keras/engine/training.py", line 1569, in predict 
    self._make_predict_function() 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/keras/engine/training.py", line 1037, in _make_predict_function 
    **kwargs) 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 2095, in function 
    return Function(inputs, outputs, updates=updates) 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 2049, in __init__ 
    with tf.control_dependencies(self.outputs): 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 3583, in control_dependencies 
    return get_default_graph().control_dependencies(control_inputs) 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 3314, in control_dependencies 
    c = self.as_graph_element(c) 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2405, in as_graph_element 
    return self._as_graph_element_locked(obj, allow_tensor, allow_operation) 
    File "/Users/zachariahmiller/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2484, in _as_graph_element_locked 
    raise ValueError("Tensor %s is not an element of this graph." % obj) 
ValueError: Tensor Tensor("dense_2/Softmax:0", shape=(?, 2), dtype=float32) is not an element of this graph. 

ich bin nicht sicher, warum außerhalb des spezifischen Aufruf der Klassifikator Laden auf die App macht scheitern sie. Es sollte in Erinnerung bleiben, und ich habe andere Beispiele von Leuten gesehen, die das mit SKLearn Classifiers machen. Irgendwelche Ideen, warum dies diesen Fehler verursacht?

+0

Sieht aus wie ein Threading-Problem für mich, für mich zu beeinflussen scheinen. Googeln zeigt einige ähnliche Probleme bei der Arbeit mit Keras auf Tensorflow und Flask. Eine Lösung scheint explizit an der richtigen Grafik zu arbeiten: https://www.tensorflow.org/versions/r0.11/api_docs/python/framework/utility_functions#get_default_graph –

Antwort

0

Hallo, ich hatte das gleiche Problem.

Ich habe meinen Python-Server als Thread = True ausgeführt. Das Entfernen dieser, lässt Mine arbeiten

app.run(host='0.0.0.0', port=5000, threaded=True) 

---->

app.run(host='0.0.0.0', port=5000) 

Debug nichts

Verwandte Themen