Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Keras Tensorflow-从多个线程进行预测时出现异常_Multithreading_Tensorflow_Keras - Fatal编程技术网

Multithreading Keras Tensorflow-从多个线程进行预测时出现异常

Multithreading Keras Tensorflow-从多个线程进行预测时出现异常,multithreading,tensorflow,keras,Multithreading,Tensorflow,Keras,我正在使用keras 2.0.8和tensorflow 1.3.0后端 我正在类init中加载一个模型,然后使用它来预测多线程 将tensorflow导入为tf 从keras导入后端为K 从keras.models导入负载_模型 类别CNN: 定义初始化(自,模型路径): self.cnn\u model=加载模型(模型路径) self.session=K.get_session() self.graph=tf.get\u default\u graph() def查询_cnn(自我,数据):

我正在使用keras 2.0.8和tensorflow 1.3.0后端

我正在类init中加载一个模型,然后使用它来预测多线程

将tensorflow导入为tf
从keras导入后端为K
从keras.models导入负载_模型
类别CNN:
定义初始化(自,模型路径):
self.cnn\u model=加载模型(模型路径)
self.session=K.get_session()
self.graph=tf.get\u default\u graph()
def查询_cnn(自我,数据):
X=自预处理(数据)
使用self.session.as_default():
使用self.graph.as_default():
返回自我。cnn_模型。预测(X)
我初始化CNN一次,查询CNN方法从多个线程执行

我在日志中得到的例外情况是:

文件“/home/*/Similarity/CNN.py”,第43行,查询\u CNN
返回自我。cnn_模型。预测(X)
文件“/usr/local/lib/python3.5/dist-packages/keras/models.py”,第913行,在predict中
返回self.model.predict(x,batch\u size=batch\u size,verbose=verbose)
文件“/usr/local/lib/python3.5/dist-packages/keras/engine/training.py”,第1713行,在predict中
详细=详细,步骤=步骤)
文件“/usr/local/lib/python3.5/dist-packages/keras/engine/training.py”,第1269行,循环中
批量输出=f(批量输入)
文件“/usr/local/lib/python3.5/dist packages/keras/backend/tensorflow\u backend.py”,第2273行,在调用中__
**自我介绍(kwargs)
文件“/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py”,第895行,正在运行
运行_元数据_ptr)
文件“/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py”,第1124行,正在运行
feed_dict_tensor、options、run_元数据)
文件“/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py”,第1321行,运行
选项,运行(元数据)
文件“/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py”,第1340行,在
提升类型(e)(节点定义、操作、消息)
tensorflow.python.framework.errors\u impl.NotFoundError:PruneForTargets:未找到某些目标节点:group\u deps
代码在大多数情况下运行良好,这可能是多线程的一些问题


如何修复它?

确保在创建其他线程之前完成图形创建

在图形上调用
finalize()
,可能会对您有所帮助

def\uuuuu init\uuuuuuuuuuuuuuuuuu(自,模型路径):
self.cnn\u model=加载模型(模型路径)
self.session=K.get_session()
self.graph=tf.get\u default\u graph()
self.graph.finalize()
更新1:
finalize()
将使图形只读,以便在多个线程中安全使用。作为一个副作用,它将帮助您发现无意行为,有时还会发现内存泄漏,因为当您尝试修改图形时,它将引发异常

假设您有一个线程,例如对输入进行一次热编码。(坏例子:)

def预处理(自身、数据): one_hot_data=tf.one_hot(data,depth=self.num_类) 返回self.session.run(一个热数据) 如果打印图形中对象的数量,您会注意到它会随着时间的推移而增加

#tf图中的节点数量
打印(len(列表(tf.get_default_graph().as_graph_def().node)))
但是如果您首先定义了图形,情况就不会是这样了(代码稍微好一点):

def预处理(自身、数据): #以self.input作为占位符运行预创建的操作 返回self.session.run(self.one_hot_data,feed_dict={self.input:data}) 更新2:根据这一点,您需要调用
model.\u在执行多线程处理之前,在keras模型上生成\u predict\u function()

Keras在您第一次调用predict()时构建GPU函数。那个 这样,如果你从不打电话预测,你就节省了一些时间和资源。 但是,第一次调用predict的速度比每次调用都要慢一些 其他时间

更新代码:

def\uuuuu init\uuuuuuuuuuuuuuuuuu(自,模型路径):
self.cnn\u model=加载模型(模型路径)
self.cnn_model._make_predict_function()#必须在线程之前初始化
self.session=K.get_session()
self.graph=tf.get\u default\u graph()
self.graph.finalize()#将图形设为只读
更新3:我做了一个预热的概念验证,因为
\u make\u predict\u function()。
首先,我创建了一个虚拟模型:

将tensorflow导入为tf
从keras.layers导入*
从keras.models导入*
模型=顺序()
添加(密集(256,输入_形=(2,))
model.add(密集(1,activation='softmax'))
compile(loss='mean\u squared\u error',optimizer='adam')
model.save(“dummymodel”)
然后在另一个脚本中,我加载了该模型并使其在多个线程上运行

将tensorflow导入为tf
从keras导入后端为K
从keras.models导入负载_模型
将线程导入为t
将numpy作为np导入
K.清除会话()
类别CNN:
定义初始化(自,模型路径):
self.cnn\u model=加载模型(模型路径)
self.cnn_model.predict(np.array([[0,0]])#warmup
self.session=K.get_session()
self.graph=tf.get\u default\u graph()
self.graph.finalize()#finalize
def预处理(自身、数据):
#假人
返回数据
def查询_cnn(自我,数据):
X=自预处理(数据)
使用self.session.as_default():
使用self.graph.as_default():
预测=自我。cnn_模型。预测(X)
打印(预测)
收益预测
cnn=cnn(“dummymodel”)
th=t.Thread(target=cnn.query_cnn,kwargs={“data”:np.random.random((500,2))})
th2=t.Thread(target=cnn.query_cnn,kwargs={“data”:np.random.random((500,2))})
th3=t.Thread(target=cnn.query_cnn,kwargs={“data”:np.random.random((500,2))})
th4=t.Thread(目标=cnn