我正在使用在Lua中使用Torch进行图像处理的CNN模型(AlexNet).我正在修改 Torch starter code. 我的问题是我用18个频道而不是3个频道制作图像来训练模型,并且为了将这些图像发送到GPU,它比用三
我的问题是我用18个频道而不是3个频道制作图像来训练模型,并且为了将这些图像发送到GPU,它比用三个频道发送图像时需要大约20个(每批2.13秒).每批0.14s).我还试着看看将4个通道的图像发送到GPU需要多长时间.我看到,一旦通道数量增加到3个以上的通道,时间就增加了大约20倍.例如,即使对于具有4个通道的图像,每批次花费大约2秒,这比运行3通道图像大约多19倍.
我想知道是否有一个错误,这需要花费很多时间,如果没有任何错误,如果有任何方法,我可以减少这个运行时间?
简答这是一个不会消失的问题.这是CPU到GPU缓冲的带宽问题.您已经增加了必须通过总线发送的数据量.
可能的解决方法
您要做的事情的本质是在模型中包含先前的帧.如果这是你想要完成的,那么还有另一种方法.
如果训练批次不是随机选择的堆叠图像,则相反,训练批次是常规图像,但是所有顺序都是时间顺序的.
在第二种情况下,您只需3个频道即可发送图像,但图像不会出现故障.
让我们探索一下假设.
首先,您仍然可以通过更改每个批次的开始时间和结束时间来创建随机抽样,并随机选择要选择的视频.
其次,你可以使用[批量,高度,重量,通道]张量在GPU上生成一个新的张量
[ batch[1:], height, width, channel] - [ batch[:-1], height, width, channel] and assign it to diffTensor
然后连接以下张量
origTensor [ batch[5:-0], height, width, channel] diffTensor [ batch[5:-0], height, width, channel] diffTensor [ batch[4:-1], height, width, channel] diffTensor [ batch[3:-2], height, width, channel] diffTensor [ batch[2:-3], height, width, channel] diffTensor [ batch[1:-4], height, width, channel] diffTensor [ batch[0:-5], height, width, channel]
如果你想5“回头看”
这将实现什么?好吧,如果你发送100张图像到GPU,那么这个网络将能够生成95个图像差异图像,网络价格仅发送100个图像,而不是你试图发送95个图像差异图像,每个图像有5层我必须支付发送500张图像的网络价格.基本上,您可以将网络成本降低近x5