- 大卷积转化为小卷积:根据VGG的思想,对于大的卷积核可以转换为多个相同卷积串联的方式来减少。具体如下:
由图可以看出一个5X5的卷积核可以换成两个3X3的卷积,此时参数的个数由25变成了18(2X3X3),同理对于一个7X7的卷积核可以变成3个3X3的卷积,此时参数量由49变成了27。所以此时得到相同的效果使用了更少的参数。假设输入的特征大小是M,N,那么相同的输出效果计算量的变化为:(5X5): MxNx5x5和(2个3x3): MxNx3x3+MxNx3x3,计算量发生了明显的改变。
所以根据上述思想,应该尽量使用3X3的卷积核。
2. 采用DepthWise方式卷积
下述的计算过程均假设卷积计算时的padding和stride均为1。
常规的卷积计算需要将每个卷积核与特征图谱的每个通道进行卷积计算得出的结果再相加得到对应的一个通道数。假设特征图谱的大小为M,N,通道数是C,卷积计算的卷积核大小为KxK,通道数是D,则此时需要的计算量是:MxNxCxKxKxD。此时参数量为KxKxD
此时如果采用DepthWise的卷积方式。假设卷积计算分成两个部分,第一个部分是KxK,通道数是C,第二个是1X1,通道数是D。则此时的计算量为:MxNxKxKxC+MxNxCxD。此时的参数量为KxKxC+1x1xD。
由于特征提取的过程是一个通道增加的过程,所以此时D>C,最终可以得出MxNxKxKxC+MxNxCxD = (MxNxC)x(KxK+D) <(MxNxC)x(KxKxD)
由上述表达式可以看出计算量明显减小,并且计算效果相同。
3. 采用shuffle-channel方式卷积
上述Depthwise的方式中大量的计算均会集中在最后1X1的卷积计算中,因为D一般会远大于C,也大于卷积核(一般卷积核都是3X3或者5X5,而D一般时64,128,512等等),
为了解决这个问题,可以考虑分组进行,即假设输入由64个通道,卷积核由128个通道,将整个过程分成两组,则对于输入的前32个通道使用卷积的前64个进行计算,得出64个通道,对于输入的后32个采用卷积核的后64个最终得出了64个通道,最后整个输出就有64变成了128个。但是此时存在一个问题,就是前64个输出只使用了前32个输入,特征的提取过程没有使用到全局特征。
但是根据shuffleNet网络可以看出,存在一个shuffle-channel的方法,该方法就是为了解决分组通道的合并问题,即:按照上述的分组方式,得到2组输出,每一组有64个通道数。此时对每一块的输出都分成2组,编号分别是1和2,再将1的放在一起构成一个64的输出,2的放在一起构成一个64的输出,最终组合就是成了128的输出。此时每一个输出组中都有来自每个输入组的数据,最终可以按输出组继续计算。其具体过程如下:
4. CReLU:
CReLU = [ReLU(x), ReLU(-x)] ,由公式可以看出该方法是为了减少通道数使用的,可以在卷积计算的时候减少一倍的通道数,在非线性**的时候采用CRELU的方式对输入进行**可以将输出变成原来的2倍。
5. 去掉全连接层:
借鉴于inception实现过程,最后的全连接层可以变成对应的卷积层,要求输出的通道数是分类的输就行了,然后再对其进行tf.squeeze进行转换。这样可以减少计算量