2017-02-10 3 views
1

Ich benutze Kolben Server mit Sellerie und redis. Der Fehler ist aufgetreten, wenn .apply_async() aufgerufen wird. Das numpige Array ist Teil der Visualisierung der Ausgabe eines neuralen Netzwerkmodells von Keral. Ich weiß, dass es eine Möglichkeit gibt, Keras-Modell in Json zu konvertieren. Mein Hauptproblem liegt in der Tatsache, dass ich nicht weiß, wann oder wie Sellerie die Umwandlung durchführt, und ich habe keine Kontrolle darüber.Sellerie Fehler: numpy Array ist nicht JSON serializable

Hier ist mein Code:

@celery.task(bind=True) 
def celery_createDirectoryAndSaveNNOutput(self, pInput, ID, filename, layersToShow, model): 
    layer_outputs = [layer.output for layer in model.layers[1:]] 
    viz_model = Model(input=model.input, output=layer_outputs) 
    features = viz_model.predict(pInput) 

    layerOutputs = {} 
    folderName = "static/"+ID+"_"+filename 

    if not os.path.exists(folderName): 
     os.makedirs(folderName) 

    for layerIndex in layersToShow: 
     images = getFeatureMapImages(features[int(layerIndex)]) 
     layerOutputs[layerIndex] = [] 
     for i in range(0, len(images)): 
      path = folderName+"/layer"+str(int(layerIndex))+"_"+str(i)+".jpg" 
      cv2.imwrite(path, images[i]) 
      layerOutputs[layerIndex].append(path) 
     self.update_state(state='PROGRESS', meta={'current': 0, 'total': 10,"status":filename}) 

    return {'current': i, 'total': len(layersToShow),'status': "temp"} 


@app.route("/nnvisualisation_uploadMultipleImages", methods=["POST"]) 
def nnvisualisation_uploadMultipleImages(): 
    uploaded_files = request.files.getlist("file[]") 
    weight = request.form.get("weight") 
    ID = request.form.get("ID") 

    layersToShow = [5] 
    modelName = "VGG16" 

    preds = {} 
    path = os.path.join(STATIC_PATH, uploaded_files[0].filename) 
    uploaded_files[0].save(os.path.join(STATIC_PATH, uploaded_files[0].filename)) 
    pInput, result = preTrainedModel[modelName](path) 
    #ERROR HERE: 
    task = celery_createDirectoryAndSaveNNOutput.s(pInput=pInput, ID=ID, filename=uploaded_files[0].filename, layersToShow=layersToShow, model=getModel(modelName)).apply_async(serializer='json') 
    ... 


    return jsonify({}), 202, {'Location': url_for('taskstatus',task_id=task.id)} 

ich alle yaml verfügbar Serializer versucht haben:

EncodeError: cannot represent an object: keras.engine.training.Model object at 0x10fdf26d0>

Beize:

EncodeError: Can't pickle type 'module': attribute lookup builtin.module failed

msgpack:

EncodeError: can't serialize array([[[[-103.93900299, -107.77899933, -123.68000031],... , dtype=float32) (numpy array)

json:

EncodeError: array([[[[-103.93900299, -107.77899933, -123.68000031],... , dtype=float32) (numpy array) is not JSON serializable

Jeder Kommentar oder einen Vorschlag wird sehr geschätzt. Vielen Dank.

+0

'json' ist ein Zeichenfolgenformat, das mit' javascript' kompatibel ist. Es kodiert Wörterbücher, Listen und Strings. Andere 'Python'-Klassen müssen sich in einer dieser Strukturen 'serialisieren'. 'numpy' Arrays tun das nicht automatisch, obwohl es Tools gibt, die helfen können. Suchen Sie etwas über 'keras' und' json'. – hpaulj

+0

Vielen Dank für Ihren Kommentar. Ich weiß, dass es eine Möglichkeit gibt, Keras-Modell in Json zu konvertieren. Mein Hauptproblem liegt in der Tatsache, dass ich nicht weiß, wann oder wie Sellerie die Umwandlung durchführt, und ich habe keine Kontrolle darüber. – matchifang

Antwort

-1

https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model

# save as JSON 
json_string = model.to_json() 

obwohl das spart nur die architecture nicht die Gewichte usw.

In jedem Fall, dass Sie von keras bereitgestellt, um die Methoden erforschen müssen.

+0

Vielen Dank für Ihren Kommentar. Das Problem ist, dass die Umwandlung von Sellerie durchgeführt wird, also habe ich keine Kontrolle darüber, wie das Modell in JSON geändert wird. – matchifang

+0

Könnten Sie mir bitte mitteilen, wo ich diese Codezeile einfügen soll? Ich weiß nicht, wo Sellerie es serialisiert. Vielen Dank. – matchifang

1

My main problem lies in the fact that I do not know when or how celery performs the conversion, and I do not have control over it.

Dort gibt es eine Möglichkeit, die Konvertierung zu steuern. Sie können angepassten json Serializer registrieren, der numpy array ausgeben kann.

Siehe Dieses Dokument Serializers

Und es gibt eine gute example.

Verwandte Themen