我正在使用 torch7(LUA5.3)来实施一个神经网络训练mnist数据集,但我发现火炬有两个奇怪的问题:
1。当数据大小相同时,卷积层比完全连接的线性层慢
2。 GPU中的卷积层(使用cuda9.0的TITAN X)比CPU中慢;
我做了一些简单的实验来证明:
第一个问题:
(1)当批量大小为500且特征尺寸为784(28 * 28)时,对于完全连接的线性层,输入大小为500 * 784,输出大小为300(我们将其设置为300),需要1.67秒转发数据
picture: 784 * 300 full connected linear layer
(2)使用相同的批量大小,卷积层需要3.07s,input2的大小为500 * 1 * 28 * 28,表示500个图片,1个通道,图片为28 * 28。卷积层有1个输入平面和3个输出平面,内核大小为2 * 2,步长为1,填充为0
对于第二个问题:
(1)在相同的数据大小和神经网络结构下,GPU在CPU中所需的时间比在CPU中需要更多时间:
picture: It takes 11s in GPU however 3.07s in CPU
(2)线性层效果很好,GPU中的时间比在CPU中耗时少
picture: it takes only 0.27s when running full connected linear layer in GPU
然而,很明显卷积层具有较少的权重并且需要较少的计算,我认为它应该比线性层快得多。而且,GPU不应该比CPU慢。
提前致谢
答案 0 :(得分:0)
对于第一个问题:计算时间不仅取决于输入数据大小。它还取决于权重大小,权重和输入数据之间的操作次数
对于第二个问题:
(1)
它在我的电脑上在GPU(GeForce GTX TITAN X)上运行11秒,在CPU(Intel(R)Core(TM)i7-4770 CPU @ 3.40GHz上运行14秒)。
GPU与nn.SpatialConvolutionMM,8s
如果使用nn.SpatialConvolutionMM,它的运行速度会更快。
最后一件事
权重越少并不意味着计算量越少。在计算方面,它意味着加法和乘法的数量。
卷积层花费更多时间的原因在2018-01-11添加
即使计算复杂度低于线性回归,卷积层需要更多时间的原因。我找到了关于卷积层{* 3}}的解释。卷积层会经常复制输入数据,因此可以通过矩阵乘法完成正向操作,但是,我还没有进行任何实验。您是否可以尝试使用数据复制实现卷积操作以验证原因?
答案 1 :(得分:0)
虽然我不知道为什么在GPU中运行卷积层时速度非常慢,但我找到了加速它的方法。 'cudnn'是一款基于NVIDIA CUDNN的火炬包,它可以大大加快卷积层的计算速度。有关详细信息,请参阅here。据我所知,线性层不能加速太多,然而,卷积层讲的是另一个故事