Celery错误:numpy数组不是JSON可序列化的

时间:2017-02-10 16:56:37

标签: python json numpy serialization celery

我正在使用带有芹菜和redis的烧瓶服务器。调用.apply_async()时发生错误。 numpy数组是可视化keral神经网络模型输出的一部分。我知道有一种方法可以将keras模型转换为json。我的主要问题在于我不知道芹菜何时或如何进行转换,我无法控制它。

这是我的代码:

@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)}

我已经尝试了所有可用的序列化程序 yaml:

  

EncodeError:无法表示对象:keras.engine.training.Model   对象位于0x10fdf26d0>

泡菜:

  

EncodeError:无法pickle类型'module':属性查找   内置。模块失败

msgpack:

  

EncodeError:无法序列化数组([[[[ - 103.93900299,-107.77899933,   -123.68000031],...,dtype = float32)(numpy数组)

JSON:

  

EncodeError:array([[[[ - 103.93900299,-107.77899933,   -123.68000031],...,dtype = float32)(numpy数组)不是JSON可序列化的

非常感谢任何评论或建议。谢谢。

2 个答案:

答案 0 :(得分:1)

  

我的主要问题在于我不知道芹菜何时或如何进行转换,我无法控制它。

存在一种控制转化的方法。 您可以注册自定义的json序列化程序,它可以转储numpy数组。

请参阅此文档Serializers

并且有一个很好的example

答案 1 :(得分:-1)

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

# save as JSON
json_string = model.to_json()

虽然只保存architecture而不是权重等。

无论如何,您需要探索keras提供的方法。