sess.run循环内

时间:2019-02-04 20:52:37

标签: python tensorflow

我有一个根据输入张量计算一系列操作的图。该输入张量将从网络摄像头派生。在这种情况下,我可以在while循环中使用sess.run(...)

但是,这是最佳选择吗?在while循环的每次迭代中,图形中的张量(即权重)是否保持在GPU的内存中?我读到,GPU计算最昂贵的部分是将张量从RAM迁移到GPU内存。这种迁移是在我每次致电sess.run(...)时发生的还是仅发生一次并且我可以根据需要运行sess.run(...)一次?然后我假设在调用sess.close()时张量会从GPU释放吗?

1 个答案:

答案 0 :(得分:1)

每次执行sess.run(...)时都会进行迁移。但是,我很确定可以做些事情来加快这一步。我看到您可以使用gpu版本的opencv。此外,您可以使用opencv访问网络摄像头。

但是,我也读到,这也将一直需要迁移,有时在cpu上执行所有操作可能会更慢。

我能想到的另一件事是减少从相机读取的图像数量。使用opencv可以指定每秒读取多少帧。如果您问我,最好将计算保留在cpu上,并从摄像头中仅读取几帧是最好的选择。

这里有一段代码可以做到这一点(我知道这超出了问题的范围,但我希望它对您有用):

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FPS, num_of_frames_per_second)
model = YourModel()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    while True:
        ret, frame = cap.read()
        prediction = sess.run(..., frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
        sleep(1)

像这样,您将每秒读取一帧,并使用该帧作为输入执行推理。