我有一个基于输入张量计算一系列操作的图。此输入张量将从网络摄像头导出。在这种情况下,我可以在while循环中使用sess.run(...)。
然而,这是最优的吗?在while循环的每次迭代中,图形中的张量(即权重)是否保存在GPU的内存中?我读到GPU计算最昂贵的部分是将张量从RAM迁移到GPU内存。这种迁移是在我每次调用sess.run(...)时都会发生,还是只会发生一次,并且我可以随心所欲地运行sess.run(...)?那么我猜想当sess.close()被调用时,张量会从图形处理器中释放出来?
发布于 2019-02-05 04:58:02
每次执行sess.run(...)时,都会发生迁移。然而,我非常确定可以做些事情来加速这一进程。我知道你可以使用opencv的gpu版本。此外,您还可以使用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)这样,您将每秒读取一帧,并使用该帧作为输入执行推理。
https://stackoverflow.com/questions/54524148
复制相似问题