将Flask-Socketio与Tensorflow模型一起使用会导致模型在预测时出错

时间:2019-07-09 06:53:48

标签: tensorflow keras flask-socketio

我正在尝试在python flask-socketio服务器中运行已保存权重的模型。据我所知,运行该应用程序时,权重已正确加载。当我运行前端时,该前端发出一个事件并导致模型在后端发出预测,我得到一个错误。我希望将预测结果发送回前端,以便更新显示。

这使用前端的flask-socketio后端和socket.io进行基于事件的通信。我已经尝试了许多解决方案,这些解决方案使用了基于Flask的常规REST API,对于其他人也有效,但是都没有转移到flask-socketio。

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
import numpy as np

def init():
    global model, graph
    model = Sequential()
    model.add(Dense(32, activation='relu', input_shape=(6,)))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(2, activation='linear'))
    model.compile(loss='mse', optimizer='adam', metrics=['mae'])
    model.load_weights("training_1/cp.ckpt")
    model._make_predict_function()
    graph = tf.get_default_graph()

@socketio.on('start_play')
def handle_play(json, method=['GET', 'POST']):
    global graph

    if NEURAL_NET_PLAY:
        with graph.as_default():
            state = np.array([game.get_game_state_vector()])
            prediction = model.predict(state)
            if prediction == 0:
                game.time_step({'left' : True, 'right' : False})
            else:
                game.time_step({'left' : False, 'right' : True})

    else:
        game.time_step(json)

if __name__ == '__main__':
    print("running python server")
    global NEURAL_NET_PLAY
    NEURAL_NET_PLAY = True
    if NEURAL_NET_PLAY:
        init()
    socketio.run(app, debug=False)

运行此命令时收到的错误消息是:

tensorflow.python.framework.errors_impl.FailedPreconditionError: Error while reading resource variable dense_2/bias from Container: localhost. This could mean that the variable was uninitialized. Not found: Resource localhost/dense_2/bias/N10tensorflow3VarE does not exist.
     [[{{node dense_2/BiasAdd/ReadVariableOp}}]]

在堆栈跟踪中,它在model.predict处失败。

1 个答案:

答案 0 :(得分:0)

我建议这可能是烧瓶线程的问题,因为Keras不是线程安全的。两个月前我想使用长颈瓶和keras时遇到了类似的问题。请检查this Snippet。也许可以帮助您,并为您提供解决方案。

您可以找到其他信息here