TensorFlow中关于Sess和Graph的坑

多线程跑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)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值