Я использую колбу с сельдереем и redis. Ошибка возникла при вызове .apply_async(). Массив numpy является частью визуализации вывода модели керальной нейронной сети. Я знаю, что есть способ конвертировать keras-модель в json. Моя главная проблема заключается в том, что я не знаю, когда и как сельдерей выполняет преобразование, и я не контролирую его.Ошибка сельдерея: массив numpy не является сериализуемым 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: cannot represent an object: keras.engine.training.Model object at 0x10fdf26d0>
рассол:
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
Любой комментарий или предложение с благодарностью. Спасибо.
'json' - это строковый формат, совместимый с' javascript'. Он кодирует словари, списки и строки. Другие классы 'python' должны« сериализоваться »на одну из этих структур. 'numpy' массивы не делают этого автоматически, хотя есть инструменты, которые могут помочь. Сделайте несколько поисков о 'keras' и' json'. – hpaulj
Спасибо за ваш комментарий. Я знаю, что есть способ конвертировать keras-модель в json. Моя главная проблема заключается в том, что я не знаю, когда и как сельдерей выполняет преобразование, и я не контролирую его. – matchifang