我有一个根据输入张量计算一系列操作的图。该输入张量将从网络摄像头派生。在这种情况下,我可以在while循环中使用sess.run(...)
。
但是,这是最佳选择吗?在while循环的每次迭代中,图形中的张量(即权重)是否保持在GPU的内存中?我读到,GPU计算最昂贵的部分是将张量从RAM迁移到GPU内存。这种迁移是在我每次致电sess.run(...)
时发生的还是仅发生一次并且我可以根据需要运行sess.run(...)
一次?然后我假设在调用sess.close()
时张量会从GPU释放吗?
答案 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)
像这样,您将每秒读取一帧,并使用该帧作为输入执行推理。