转载自知乎:卷积神经网络的复杂度分析html
以前的Inception学习博客:python
『TensorFlow』读书笔记_Inception_V3_上网络
『TensorFlow』读书笔记_Inception_V3_下ide
即模型的运算次数,可用FLOPs衡量,也就是浮点运算次数(FLoating-point OPerations)。post
Time~O(M2·K2·Cin·Cout)学习
M:输出特征图边长优化
K:卷积核尺寸spa
C:通道数目3d
输出边长M计算公式为:htm
M = (X - K + 2*Padding)//Stride + 1
下图展现了单个Cout的上单个点的计算示意,须要重复计算:Cout·每张输出特征图上像素数次。
Time~O(∑l=1 M2·K2·Cl-1·Cl)
l表示层编号,实质就是对各个层求和。
卷积层实现能够很好的看清实现机理:out层、out长宽、in层循环,循环体内k2级别运算:
def conv2d(img, kernel): height, width, in_channels = img.shape kernel_height, kernel_width, in_channels, out_channels = kernel.shape out_height = height - kernel_height + 1 out_width = width - kernel_width + 1 feature_maps = np.zeros(shape=(out_height, out_width, out_channels)) for oc in range(out_channels): # Iterate out_channels (# of kernels) for h in range(out_height): # Iterate out_height for w in range(out_width): # Iterate out_width for ic in range(in_channels): # Iterate in_channels patch = img[h: h + kernel_height, w: w + kernel_width, ic] feature_maps[h, w, oc] += np.sum(patch * kernel[:, :, ic, oc]) return feature_maps
空间复杂度(访存量),严格来说包括两部分:总参数量 + 各层输出特征图。
Space~O(∑K2·Cl-1·Cl + ∑M2·Cl)
M:输出特征图边长
K:卷积核尺寸
C:通道数目
时间复杂度决定了模型的训练/预测时间。若是复杂度太高,则会致使模型训练和预测耗费大量时间,既没法快速的验证想法和改善模型,也没法作到快速的预测。
空间复杂度决定了模型的参数数量。因为维度诅咒的限制,模型的参数越多,训练模型所需的数据量就越大,而现实生活中的数据集一般不会太大,这会致使模型的训练更容易过拟合。
当咱们须要裁剪模型时,因为卷积核的空间尺寸一般已经很小(3x3),而网络的深度又与模型的表征能力紧密相关,不宜过多削减,所以模型裁剪一般最早下手的地方就是通道数。
InceptionV1 借鉴了 Network in Network 的思想,在一个 Inception Module 中构造了四个并行的不一样尺寸的卷积/池化模块(上图左),有效的提高了网络的宽度。可是这么作也形成了网络的时间和空间复杂度的激增。对策就是添加 1 x 1 卷积(上图右红色模块)将输入通道数先降到一个较低的值,再进行真正的卷积。
在3*3卷积分支上加入64个1*1卷积先后的时间复杂度对好比下式:
同理,在5*5卷积分支上加入64个1*1卷积先后的时间复杂度对好比下式:
整个层的参数量变化以下:
全链接层复杂度分析:X*X的输入Flatten为X2的输入,输出神经元个数能够视为1*1*Cout,则:
Time~O(12·X2·Cin·Cout)
Space~O(X2·Cin·Cout + X2·Cin) ~ O(X2·Cin·Cout)
空间复杂度第一部分为权重参数,第二部分为当前输入大小。顺便一提我以前的一个误区:全链接层相对卷积层其运算瓶颈不在时间复杂度,而在空间复杂度,我以前的印象里把二者混为一谈了。
使用GAP后,首先将Cin·X2的输入转化为Cin,而后1*1卷积为Cout:
Time~O(Cin·Cout)
Space~O(Cin·Cout + Cin)~ O(Cin·Cout)
Space来讲可能有点问题:Cin·X2的原输入应该仍是要存储的,不过因为不涉及到卷积运算,姑且不细究。
可是注意:GAP会影响收敛速度,不过并不会影响最终的精度。
两个3*3卷积联级的感觉野与单个5*5卷积至关,计算公式可见『计算机视觉』感觉野和anchor,替换后时间复杂度却可下降:
InceptionV3 中提出了卷积的 Factorization,在确保感觉野不变的前提下进一步简化,复杂度的改善同理可得,再也不赘述。
Xception 中每一个输入通道只会被对应的一个卷积核扫描,下降了模型的冗余度。对于深度可分离卷积Depthwise Separable 是一个 Depthwise conv 加一个 Pointwise conv,其中 Depthwise 是M2·K2·Cin,Pointwise 是M2·Cin·Cout,即:
Time~O(M2·K2·Cin + M2·Cin·Cout)