我使用的是带有芹菜和redis的烧瓶服务器。调用.apply_async()时出错。numpy数组是核心神经网络模型输出可视化的一部分。我知道有一种方法可以将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.Model0x10fdf26d0>处的对象
pickle:
EncodeError:无法pickle类型"module":属性查找内置.模块故障
消息包:
EncodeError:无法序列化数组([[[103.93900299,-107.77899933,-123.68000031],…,dtype=float32)(numpy数组)
json:
EncodeError:数组([[[103.93900299、-107.77899933,-123.68000031],…,dtype=float32)(numpy数组)不是JSON可序列化
如有任何意见或建议,我们将不胜感激。非常感谢。
我的主要问题在于我不知道芹菜何时或如何进行转换,而且我无法控制它。
有一种控制转换的方法。您可以注册自定义的json序列化程序,它可以转储numpy数组。
参考本文档序列化程序
还有一个很好的例子。
https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model
# save as JSON
json_string = model.to_json()
尽管这仅节省CCD_ 1而不节省权重等
在任何情况下,您都需要探索keras
提供的方法。