2017-07-02 6 views
2

ケラスモデルを使用して予測を返すdjangoにREST APIを記述しようとしています。しかし、load_model()関数はモデルの読み込みに時間がかかり、モデルを初期化するたびにユーザーが長時間待たされることを避けたいと考えています。モデルを初期化して、そのモデルを使用して予測が一度ロードされるように、正しい方法は何でしょうか?マルチテナントをサポートするDjangoでKerasモデルを正しく読み込む

サイドノートでは、私は可能性がコールド考えの一つの方法は、以下のようsettings.pyでモデルを初期化することでした:

私の見解で

settings.py

json_file=open("model.json","r") 
loaded_json=json_file.read() 
json_file.close() 

model=model_from_json(loaded_json) 
model.load_weights("model.h5") 
MODEL=model 

そして。

views.py

:PY私は、この変数モデルを使用します

一度に1人のユーザーしかアクティブでない場合(モデルは一度初期化され、その後のすべての予測がそのモデルを使用して実行される)、これは効果的です。複数のユーザーが同時にアクティブにしているがあれば、それは最初に来たの呼び出しが、後者の呼び出しのために良い作品は、それが同時にアクセスできるように、どのように私は適切にモデルをロードする必要があり、エラー

'NoneType' object has no attribute 'shape' 
Apply node that caused the error: ConvOp{('imshp', (31, 31, 32)),('kshp', (3, 3)),('nkern', 64),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'valid'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (31, 31, 32)),('kshp_logical', (3, 3)),('kshp_logical_top_aligned', True)}(InplaceDimShuffle{0,2,3,1}.0, InplaceDimShuffle{3,2,0,1}.0) 
Toposort index: 13 
Inputs types: [TensorType(float32, 4D), TensorType(float32, 4D)] 
Inputs shapes: [(1L, 31L, 31L, 32L), 'No shapes'] 
Inputs strides: [(123008L, 124L, 4L, 3844L), 'No strides'] 
Inputs values: ['not shown', None] 
Outputs clients: [[Elemwise{Composite{(i0 * ((i1 + i2) + Abs((i1 + i2))))}}[(0, 1)](TensorConstant{(1L, 1L, 1..1L) of 0.5}, ConvOp{('imshp', (31, 31, 32)),('kshp', (3, 3)),('nkern', 64),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'valid'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (31, 31, 32)),('kshp_logical', (3, 3)),('kshp_logical_top_aligned', True)}.0, InplaceDimShuffle{x,0,x,x}.0)]] 

を与えますか?

ありがとうございます。ここ

+0

修正方法を理解しましたか? – streamride

+0

@streamrideあなたはviews.pyに必要なインスタンスごとにcopy.copy(モデル)を行い、安全に使うことができます。私はそれを使用してプロジェクトを修正しました –

+0

https://stackoverflow.com/questions/47295025/valueerror-at-image-tensor-tensoractivation-5-softmax0-shape-4-dtyp/47300005?noredirect=1#comment81555441_47300005 –

答えて

0

ご覧くださいhttps://github.com/keras-team/keras/issues/2397#issuecomment-254919212

など。 Djangoの設定で...

modelFile = 'path_to_my_model.h5'  
pipe = joblib.load(modelFile.replace('.h5','.pkl')) 
model = models.load_model(modelFile) 
pipe.steps.append(('nn', model))  
graph = tensorflow.get_default_graph() 

をモデルを構築して、DjangoのREST方式では、次のように再利用:非常によく私のために

import myDjango.settings as sett 
# ... 

@csrf_exempt 
def evaluate(request): 
    """ 
    Do the evaluation. 
    """ 
    if request.method == 'POST': 
     data = JSONParser().parse(request) 
     i = data['inputs'] 

     outputs = MyMlClass.PredictArray(sett.graph, sett.pipe , i, 'model.h5') 

     return JsonResponse(outputs, status=201, safe=False) 

ワークス(VisualStudioをDjangoプロジェクト、Pythonの3.6)。 RESTハンドラでのモデルの構築は推奨されておらず、実際には機能しません。最初の呼び出しでのみ動作します。

関連する問題