在不同线程中进行预测和培训Keras Tensorflow

时间:2018-12-04 11:22:02

标签: python multithreading tensorflow keras

我正在使用Keras和Tensorflow进行某种在线学习,我会定期接收新数据,并使用这些新数据重新训练模型。我可以将多个模型存储在“ .h5”文件中,以便在需要训练或预测时加载模型,然后执行必要的操作。

当前,我将训练和预测分为两个不同的线程,以便可以在其他线程训练时进行预测。对于锁,我尝试确保在同一模型中不会同时进行任何预测或训练(我认为这是可行的),但是我知道keras对此并不准备。关于张量流的图形或会话,我总是会出现一些不同的错误,例如:

  

回溯(最近通话最近):     wsgi_app中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ flask \ app.py”,第2292行       响应= self.full_dispatch_request()     在full_dispatch_request中的第1815行,文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ flask \ app.py”       rv = self.handle_user_exception(e)     在handle_user_exception中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ flask \ app.py”,行1718       加价(exc_type,exc_value,tb)     重新列出文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ flask_compat.py”,第35行       提高价值     在full_dispatch_request中,文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ flask \ app.py”,行1813       rv = self.dispatch_request()     在dispatch_request中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ flask \ app.py”,行1799       返回self.view_functionsrule.endpoint     文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,行859,在predict_times中       0] +'.h5')     文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,第164行,位于get_prediction中       模型,缩放比例= self.load_model_file(self.graph_pred,self.session,路径)     在load_model_file中的文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,第114行       模型= load_model(path)     在load_model中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ saving.py”,行419       模型= _deserialize_model(f,custom_objects,compile)     _deserialize_model中的第287行“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ saving.py”       K.batch_set_value(weight_value_tuples)     文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ backend \ tensorflow_backend.py”,行2470,位于batch_set_value中       get_session()。run(assign_ops,feed_dict = feed_dict)     get_session中的第206行的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ backend \ tensorflow_backend.py”       session.run(tf.variables_initializer(uninitialized_vars))     文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variables.py”,第2831行,位于variables_initializer中       返回control_flow_ops.group(* [v.var.list中v的v.initializer],名称=名称)     组中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ control_flow_ops.py”,行3432       返回_GroupControlDeps(dev,deps,name = name)     _GroupControlDeps中的第3384行文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ control_flow_ops.py”       返回no_op(name = name)     退出中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ contextlib.py”,第88行       下一个(self.gen)     设备中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ framework \ ops.py”,行4249       self._device_function_stack.pop_obj()     pop_obj中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ framework \ traceable_stack.py”,行110       返回self._stack.pop()。obj   IndexError:从空列表中弹出

还是错误:

  

线程Thread-1中的异常:   追溯(最近一次通话):     _bootstrap_inner中的第916行的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ threading.py”       self.run()     正在运行的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ threading.py”,行1182       self.function(* self.args,** self.kwargs)     火车上的文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,行632       self.update_prediction_historics_all()     文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,行649,在update_prediction_historics_all中       self.update_prediction_historics_dataset(new_dataset,loadModel = True)     文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,第672行,位于update_prediction_historics_dataset中       0] +“ .h5”,loadModel = loadModel)[     文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,行198,位于get_predictions_sequential中       模型,缩放比例= self.load_model_file(self.graph_pred,self.session,路径)     在load_model_file中的文件“ C:\ Users \ a703572 \ PycharmProjects \ ai-pred-eng \ src \ run_keras_server.py”,第114行       模型= load_model(path)     在load_model中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ saving.py”,行419       模型= _deserialize_model(f,custom_objects,compile)     _deserialize_model中的第225行的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ saving.py”       模型= model_from_config(model_config,custom_objects = custom_objects)     在model_from_config中的行458中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ saving.py”       返回反序列化(config,custom_objects = custom_objects)     反序列化文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ layers__init __。py”,第55行       printable_module_name ='图层')     在deserialize_keras_object中的第145行中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ utils \ generic_utils.py”       列表(custom_objects.items()))     文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ sequential.py”,行301,位于from_config       model.add(图层)     添加文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ sequential.py”,行181       output_tensor = layer(self.outputs [0])     调用中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ base_layer.py”,第431行       self.build(解包单个(input_shapes))     生成中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ layers \ core.py”,第872行       约束= self.bias_constraint)     包装中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ legacy \ interfaces.py”,行91       return func(* args,** kwargs)     文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ base_layer.py”,第252行,位于add_weight中       约束=约束)     变量402行中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ backend \ tensorflow_backend.py”       v = tf.Variable(值,dtype = tf.as_dtype(dtype),name =名称)     在调用中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variables.py”第183行       返回cls._variable_v1_call(* args,** kwargs)     _variable_v1_call中的第146行的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variables.py”       聚合=聚合)     文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variables.py”,第125行,在       previous_getter = lambda ** kwargs:default_variable_creator(None,** kwargs)     文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variable_scope.py”,行2444,位于default_variable_creator中       Expected_shape = expected_shape,import_scope = import_scope)     调用中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variables.py”,第187行       返回super(VariableMetaclass,cls)。调用(* args,** kwargs)      init 中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variables.py”,第1329行       约束=约束)     文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ ops \ variables.py”,行1492,位于_init_from_args中       ops.add_to_collections(收藏夹,自己)     退出中的文件“ C:\ Users \ a703572 \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ contextlib.py”,第88行       下一个(self.gen)     文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ framework \ ops.py”,行5347,位于init_scope中       让     退出中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ framework \ ops.py”,行4369       self._graph._pop_control_dependencies_controller(自我)     _pop_control_dependencies_controller中的文件“ C:\ Users \ a703572 \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tensorflow \ python \ framework \ ops.py”,行4390       断言self._control_dependencies_stack [-1]是控制器   AssertionError

我的解决方案是使用图形进行预测,并使用图形进行训练,每次我要执行tf操作时,我都会使用:

with server_predict.graph_pred.as_default():
    with tf.Session(graph=server_predict.graph_pred) as sess:

我还添加了这一行:

        backend.set_session(sess)

尽管如此,我仍然遇到来自tf会话或图形的错误,因为似乎操作没有正确分开。关于tf会话,另一个错误是我在此issue中写的仍然打开的错误。使用k.clear_session()(k = keras后端)给出的解决方案对我不起作用。

有人遇到过类似的问题或编写了可能对我有帮助的类似任务吗?

谢谢!


找到一个“包装纸”来使这项工作生效。我没有在同一个类(自定义)上启动两个线程,而是拥有两个相同类的对象,一个对象专用于训练,另一个对象用于预测。这不是真正的多线程应用程序(即使两个对象是从同一主程序启动的)。在找到合适的多线程解决方案之前,这可能会有所帮助。

但是我不知道我以前是怎么得到错误的,只是没有两个对象,即使这些对象在同一进程中运行也是如此。 keras / tensorflow只能在一个图上执行操作,而在同一进程中为不同对象定义不同的图吗?

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是拥有两个单独的keras模型-第一个在推理模式下运行,第二个在训练模式下运行。每次推理模型获取新的数据集进行预测时,它都会首先检查其是否具有最新的.h5文件,如果没有,则首先将其加载,然后运行预测。这样您可以避免锁等。

很难针对您的情况提供建议,因为您想要的可能与我需要的不一样

  • 这是我在使用Tensorflow Multiprocessing完成类似操作后的观点