CNN加速,原文链接:Speeding up Convolutional Neural Networks
几种加速CNN训练的方法,同时不会对模型最终的准确率有较大的影响。
全连接层是网络占用大量内存的主要原因,但是运行速度却很快,而卷积虽然减少了参数数量,但却需要消耗更多的计算资源,因此,应该从卷积操作本身入手,寻找优化的方法。
以下几种方法可以在不严重影响准确率的前提下加速卷积计算(有些在现有的一些网络中出现过,比如ResNet,DenseNet)
1. 卷积核分解
首先看一个Numpy里面关于矩阵的例子
>>> from numpy.random import random
>>> random((3, 3)).shape == (random((3, 1)) * random((1, 3))).shape
>>> True
我们知道一个N*N的矩阵可以由一个N*1和一个1*N的矩阵相乘得到(线性代数知识),注意,这里是shape相同。通常,一次卷积计算产生的参数个数为input_channels*n*n*output_channels(filter_nums),当把卷积核大小分解成N*1和1*N以后,参数个数就变为2*input_channels*n*output_channels(filter_nums),参数个数减少了,自然计算资源消耗也