【发布时间】:2019-05-05 19:35:04
【问题描述】:
我正在使用 Keras 和 Tensorflow 进行一种在线学习,我会定期接收新数据并使用这些新数据重新训练我的模型。我可以将多个模型存储在“.h5”文件中,以便在需要训练或预测时加载模型,然后执行必要的操作。
目前我将训练和预测分开在两个不同的线程中,以便可以在其他线程训练的同时进行预测。使用锁我试图确保没有同时在同一个模型中进行预测或训练(我认为这可行),但我知道 keras 并没有为此做好准备。关于 tensorflow 的图形或会话,我总是有一些不同的错误,例如:
Traceback(最近一次调用最后一次): wsgi_app 中的文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py”,第 2292 行 响应 = self.full_dispatch_request() 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py”,第 1815 行,在 full_dispatch_request rv = self.handle_user_exception(e) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py”,第 1718 行,在 handle_user_exception reraise(exc_type, exc_value, tb) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\flask_compat.py”,第 35 行,重新提出 升值 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py”,第 1813 行,在 full_dispatch_request rv = self.dispatch_request() 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py”,第 1799 行,在 dispatch_request 中 返回 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,路径) 文件“C:\Users\a703572\PycharmProjects\ai-pred-eng\src\run_keras_server.py”,第 114 行,在 load_model_file 模型 = 加载模型(路径) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\saving.py”,第 419 行,在 load_model 模型 = _deserialize_model(f, custom_objects, 编译) _deserialize_model 中的文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\saving.py”,第 287 行 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) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\backend\tensorflow_backend.py”,第 206 行,在 get_session session.run(tf.variables_initializer(uninitialized_vars)) 文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\variables.py”,第 2831 行,在 variables_initializer 中 return control_flow_ops.group(*[v.initializer for v in var_list], name=name) 文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\control_flow_ops.py”,第 3432 行,分组 返回_GroupControlDeps(开发,部门,名称=名称) _GroupControlDeps 中的文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\control_flow_ops.py”,第 3384 行 返回 no_op(名称=名称) 退出中的文件“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() 文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\framework\traceable_stack.py”,第 110 行,在 pop_obj 中 返回 self._stack.pop().obj IndexError: 从空列表中弹出
或者错误:
线程 Thread-1 中的异常: 回溯(最近一次通话最后): _bootstrap_inner 中的文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\threading.py”,第 916 行 自我运行() 运行中的文件“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,路径) 文件“C:\Users\a703572\PycharmProjects\ai-pred-eng\src\run_keras_server.py”,第 114 行,在 load_model_file 模型 = 加载模型(路径) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\saving.py”,第 419 行,在 load_model 模型 = _deserialize_model(f, custom_objects, 编译) _deserialize_model 中的文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\saving.py”,第 225 行 模型 = model_from_config(model_config, custom_objects=custom_objects) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\saving.py”,第 458 行,在 model_from_config 返回反序列化(配置,custom_objects=custom_objects) 反序列化文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\layers__init__.py”,第 55 行 printable_module_name='层') 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\utils\generic_utils.py”,第 145 行,在 deserialize_keras_object 列表(custom_objects.items()))) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\sequential.py”,第 301 行,在 from_config 模型.添加(层) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\sequential.py”,第 181 行,添加 output_tensor = 层(self.outputs[0]) 调用中的文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\base_layer.py”,第 431 行 self.build(unpack_singleton(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 行 返回函数(*args,**kwargs) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\base_layer.py”,第 252 行,在 add_weight 约束=约束) 文件“C:\Users\a703572\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\backend\tensorflow_backend.py”,第 402 行,在变量中 v = tf.Variable(值,dtype=tf.as_dtype(dtype),名称=名称) 调用中的文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\variables.py”,第 183 行 返回 cls._variable_v1_call(*args, **kwargs) _variable_v1_call 中的文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\variables.py”,第 146 行 聚合=聚合) 文件“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 预期形状=预期形状,进口范围=进口范围) 调用中的文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\variables.py”,第 187 行 return super(VariableMetaclass, cls).call(*args, **kwargs) init 中的文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\variables.py”,第 1329 行 约束=约束) _init_from_args 中的文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\variables.py”,第 1492 行 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(self) _pop_control_dependencies_controller 中的文件“C:\Users\a703572\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\framework\ops.py”,第 4390 行 断言 self._control_dependencies_stack[-1] 是控制器 断言错误
我的解决方案是使用一个图进行预测和一个图进行训练,每次我想执行一个 tf 操作时,我都会使用:
with server_predict.graph_pred.as_default():
with tf.Session(graph=server_predict.graph_pred) as sess:
我还加了一行:
backend.set_session(sess)
尽管如此,我仍然收到来自 tf 会话或图表的错误,因为似乎操作没有正确分离。另一个错误是我在这个issue 中写的关于 tf 会话的仍然打开的错误。使用 k.clear_session() (k = keras backend) 给出的解决方案对我不起作用。
有没有人遇到过类似的问题或编写过类似的任务来帮助我?
谢谢!!
找到一个“包装”来完成这项工作。我没有在同一个类(自定义)上启动两个线程,而是拥有同一个类的两个对象,一个专用于训练,另一个用于预测。这不是一个真正的多线程应用程序(即使这两个对象是从同一个主线程启动的)。在我(我们)找到合适的多线程解决方案之前,这可能会有所帮助。
但是我不明白我之前是如何得到错误的,只是没有两个对象,即使这些对象在同一个进程中运行。是不是keras/tensorflow只能对一个图进行操作,而在同一个进程上为不同的对象定义不同的图?
【问题讨论】:
-
艰难的一个......但似乎 keras 只有一张图,不管你有多少模型。是否可以有两个 keras 实例,每个线程一个?
-
您实际上是在问我这是否可行,或者我是否可以编程? XD 不知道有没有可能有两个keras实例,这个你知道吗?
-
不,我不... :( --- 我对线程了解不多,但是如果两个不同的线程导入自己的 Keras 并将所有内容保留在内部,也许它会是可行吗?
标签: python multithreading tensorflow keras