2017-02-10 16 views
1

Я использую колбу с сельдереем и 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

Любой комментарий или предложение с благодарностью. Спасибо.

+0

'json' - это строковый формат, совместимый с' javascript'. Он кодирует словари, списки и строки. Другие классы 'python' должны« сериализоваться »на одну из этих структур. 'numpy' массивы не делают этого автоматически, хотя есть инструменты, которые могут помочь. Сделайте несколько поисков о 'keras' и' json'. – hpaulj

+0

Спасибо за ваш комментарий. Я знаю, что есть способ конвертировать keras-модель в json. Моя главная проблема заключается в том, что я не знаю, когда и как сельдерей выполняет преобразование, и я не контролирую его. – matchifang

ответ

-1

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

# save as JSON 
json_string = model.to_json() 

хотя это спасает только те architecture не веса и т.д.

В любом случае вам нужно изучить методы, предоставляемые keras.

+0

Спасибо за ваш комментарий. Проблема в том, что преобразование осуществляется сельдереем, поэтому я не контролирую, как модель изменена на json. – matchifang

+0

Не могли бы вы посоветовать мне, где я должен поставить эту строку кода? Я не знаю, где сельдерей сериализует его. Спасибо. – 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.

Там доза существует, чтобы контролировать преобразование. Вы можете зарегистрировать настроенный сериализатор json, который может сбрасывать массив numpy.

См данный момент этот документ Serializers

И есть хороший example.

 Смежные вопросы

  • Нет связанных вопросов^_^