我正在尝试在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处失败。
答案 0 :(得分:0)
我建议这可能是烧瓶线程的问题,因为Keras不是线程安全的。两个月前我想使用长颈瓶和keras时遇到了类似的问题。请检查this Snippet。也许可以帮助您,并为您提供解决方案。
您可以找到其他信息here。