我正在使用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只能在一个图上执行操作,而在同一进程中为不同对象定义不同的图吗?
答案 0 :(得分:0)
最简单的解决方案是拥有两个单独的keras模型-第一个在推理模式下运行,第二个在训练模式下运行。每次推理模型获取新的数据集进行预测时,它都会首先检查其是否具有最新的.h5
文件,如果没有,则首先将其加载,然后运行预测。这样您可以避免锁等。
很难针对您的情况提供建议,因为您想要的可能与我需要的不一样