前提・実現したいこと
python のFlaskでサーバーを立てて、ウェブ上で機械学習により判別するシステムを作っています。
ユーザからのデータをwebでもらい、ウェブでの学習ボタンを押すとそのデータをpythonに投げ、pythonで学習させています。
しかし一度目の学習はうまくできるのですが、そのボタンを2回目以降押すとエラーがでます。
またその問題となっているモジュールを上書き保存して、更新すると一回目だけはうまく学習できます。
何がいけないのでしょうか?
発生している問題・エラーメッセージ
TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("conv2d_1_input:0", shape=(?, 6, 10, 1), dtype=float32) is not an element of this graph.
該当のソースコード
python
1 2//サーバたてるコード 3@app.route('/') 4def index(): 5 with open("index5online.html", "rb") as f: 6 return render_template('index5online.html') 7 #オンライン学習用の推定 8 9@app.route('/learning/',methods=['GET','POST']) 10def learning(): 11 label = act5_keras.keras_learning() 12 13 return ('----finish learning by %s--- '%(label) )
python
1 2//act5_keras.py 3def keras_learning(): 4 5 //一部処理 6 7 # CNNモデル構造を定義 --- (*2) 8 model = Sequential() 9 model.add(Conv2D(32, kernel_size=(3, 3), 10 activation='relu', 11 input_shape=in_shape)) 12 model.add(Conv2D(64, (3, 3), activation='relu')) 13 model.add(MaxPooling2D(pool_size=(2, 2))) 14 model.add(Dropout(0.25)) 15 model.add(Flatten()) 16 model.add(Dense(128, activation='relu')) 17 model.add(Dropout(0.5)) 18 model.add(Dense(out_size, activation='softmax')) 19 20 # モデルを構築 --- (*3) 21 model.compile( 22 loss='categorical_crossentropy', 23 optimizer=RMSprop(), 24 metrics=['accuracy']) 25 26 # 学習を実行 --- (*4) 27 hist = model.fit(X_train, y_train, 28 batch_size=128, 29 epochs=30, 30 verbose=1, 31 validation_data=(X_test, y_test)) 32 33 # モデルを評価 --- (*5) 34 score = model.evaluate(X_test, y_test, verbose=1) 35 print('正解率=', score[1], 'loss=', score[0]) 36 """ 37 # 学習の様子をグラフへ描画 --- (*6) 38 # 正解率の推移をプロット 39 plt.plot(hist.history['acc']) 40 plt.plot(hist.history['val_acc']) 41 plt.title('Accuracy') 42 plt.legend(['train', 'test'], loc='upper left') 43 plt.show() 44 45 # ロスの推移をプロット 46 plt.plot(hist.history['loss']) 47 plt.plot(hist.history['val_loss']) 48 plt.title('Loss') 49 plt.legend(['train', 'test'], loc='upper left') 50 plt.show() 51 """ 52 model.save('CNN_model.h5') 53 model.save_weights('CNN_weight.h5') 54 55 return "keras" 56 57 58def keras_predict(arr): 59//予測の関数 60 model = load_model('CNN_model.h5') 61 model.load_weights('CNN_weight.h5') 62///.... 63 64
試したこと
一回目だけは有効なのが良く理解できません、
参考をみましたが、
マルチスレッドで動作する場合に、読み込んだモデルが別のスレッドには共有されないため起きる。ということらしいのですが、
act5_keras.pyの予測の関数でモデルを読み込んでるのがいけないのでしょうか?
予測の関数は、ユーザが予測ボタンを押さないと動かないようになっていますが、、、
なにを変えれば良いのでしょうか?
あなたの回答
tips
プレビュー