多线程跑TensorFlow多分类模型时遇到报错:
- FailedPreconditionError: Error while reading resource variable the variable was uninitialized
- Failed to get convolution algorithm. This is probably because cuDNN failed to initialize
- RuntimeError:The Session graph is empty.
代码
如下:
在主函数中初始化模型
import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) # 屏蔽WARNING★★
mPath = r'model_VGG16_Straka.h5'
model = tf.keras.models.load_model(mPath)
=================================================================
在另一个线程中进行分类
img = cv.cvtColor(np.asarray(frame), cv.COLOR_BGR2RGB).reshape((1,720,1280,3))/255
result = [classes[k] for k in np.argmax(np.asarray(model.predict(img, verbose=0, batch_size=1)),axis=1)]
问题所在:
在另一个线程/函数中,tf 2.1会认为是另一个程序在进行计算,我们需要保证只使用同一个session,因此需要将会话和图迁移过去。
注意:只要出现了模型预测的地方,都需要加下面的 代码
。
在主函数中初始化模型并记录当前会话和图
mPath = r'model_VGG16_Straka.h5'
model = tf.keras.models.load_model(mPath,{'focal_loss_fixed': focal_loss(alpha=.25, gamma=2)})
graph = tf.get_default_graph()
sess = tf.keras.backend.get_session()
# 注意!!!多线程会导致sess和graph不同 必须提前记录下★★
=================================================================
在另一个线程中进行分类
with sess.as_default():
with graph.as_default():
# 注意!!!多线程会导致sess和graph不同 必须在每次预测前手动更改
img = cv.cvtColor(np.asarray(frame), cv.COLOR_BGR2RGB).reshape((1,720,1280,3))/255
result = [classes[k] for k in np.argmax(np.asarray(model.predict(img, verbose=0, batch_size=1)),axis=1)]