卷积神经网络的复杂度分析

卷积神经⽹络的复杂度分析
在梳理CNN经典模型的过程中,我理解到其实经典模型演进中的很多创新点都与改善模型计算复杂度紧密相关,因此今天就让我们对卷积神经⽹络的复杂度分析简单总结⼀下下。
本⽂主要关注的是 针对模型本⾝的复杂度分析(其实并不是很复杂啦~)。如果想要进⼀步评估模型 在计算平台上的理论计算性能,则需要了解 Roofline Model 的相关理论,欢迎阅读本⽂的进阶版: 。
1. 时间复杂度
1.1 单个卷积层的时间复杂度
注1:为了简化表达式中的变量个数,这⾥统⼀假设输⼊和卷积核的形状都是正⽅形。
1.2 卷积神经⽹络整体的时间复杂度
神经⽹络第
神经⽹络第  个卷积层的输出通道数
对于第  个卷积层⽽⾔,其输⼊通道数
可见,CNN整体的时间复杂度并不神秘,只是所有卷积层的时间复杂度累加⽽已。
简⽽⾔之,层内连乘,层间累加。
⽰例:⽤ Numpy ⼿动简单实现⼆维卷积
假设 Stride = 1, Padding = 0, img 和 kernel 都是 np.ndarray.
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]
济南ufofeature_maps[h, w, oc] += np.sum(patch * kernel[:, :, ic, oc])
return feature_maps
2. 空间复杂度
空间复杂度包括模型的参数数量(模型本⾝的体积)和每层输出的特征图⼤⼩(会影响模型运⾏时的内存占⽤情况)。
交通流
当我们需要裁剪模型时,由于卷积核的尺⼨通常已经很⼩,⽽⽹络的深度⼜与模型的能⼒紧密相关,不宜过多削减,因此模型裁剪通常最先下⼿的地⽅就是通道数。
3. 复杂度对模型的影响
时间复杂度决定了模型的训练/预测时间。如果复杂度过⾼,则会导致模型训练和预测耗费⼤量时间,既⽆法快速的验证想法和改善模型,也⽆法做到快速的预测。
百位老人积蓄被骗
空间复杂度决定了模型的参数数量。由于维度诅咒的限制,模型的参数越多,训练模型所需的数据量就越⼤,⽽现实⽣活中的数据集通常不会太⼤,这会导致模型的训练更容易过拟合。
4. Inception 系列模型是如何优化复杂度的
通过五个⼩例⼦说明模型的演进过程中是如何优化复杂度的。
(图像被压缩的惨不忍睹...)
InceptionV1 借鉴了 Network in Network 的思想,在⼀个 Inception Module 中构造了四个并⾏的不同尺⼨的卷积/池化模块(上图左),有效的提升了⽹络的宽度。但是这么做也造成了⽹络的时间和空间复杂度的激增。对策就是添加 1 x 1 卷积(上图右红⾊模块)将输⼊通道数先降到⼀个较低的值,再进⾏真正的卷积。
雷海清
蔡琳近况
漂泊者萧红
可见,与真正的卷积层不同,全连接层的空间复杂度与输⼊数据的尺⼨密切相关。因此如果输⼊图像尺⼨越⼤,模型的体积也就会越⼤,这显然是不可接受的。例如早期的VGG系列模型,其 90% 的参数都耗费在全连接层上。
InceptionV1 中使⽤的全局最⼤池化 GAP 改善了这个问题。由于每个卷积核输出的特征图在经过全局最⼤池化后都会直接精炼成⼀个标量点,因此全连接层的复杂度不再与输⼊图像尺⼨有关,运算量和参数数量都得以⼤规模削减。复杂度分析如下:
感受野不变
尺⼨完全⼀样,即感受野相同。
同样根据上⾯提到的复杂度分析公式,可知:这种替换能够⾮常有效的降低时间和空间复杂度。我们
可以把⾟⾟苦苦省出来的这些复杂度⽤来提升模型的深度和宽度,使得我们的模型能够在复杂度不变的前提下,具有更⼤的容量,爽爽的。
InceptionV3 中提出了卷积的 Factorization,在确保感受野不变的前提下进⼀步简化。
复杂度的改善同理可得,不再赘述。
我们之前讨论的都是标准卷积运算,每个卷积核都对输⼊的所有通道进⾏卷积。
Xception 模型挑战了这个思维定势,它让每个卷积核只负责输⼊的某⼀个通道,这就是所谓的 Depth-wise Separable
Convolution。
从输⼊通道的视⾓看,标准卷积中每个输⼊通道都会被所有卷积核蹂躏⼀遍,⽽ Xception 中每个输⼊通道只会被对应的⼀个卷积核扫描,降低了模型的冗余度。
标准卷积与可分离卷积的时间复杂度对⽐:可以看到本质上是把连乘转化成为相加。
5. 总结
通过上⾯的推导和经典模型的案例分析,我们可以清楚的看到其实很多创新点都是围绕模型复杂度的优化展开的,其基本逻辑就是乘变加。模型的优化换来了更少的运算次数和更少的参数数量,⼀⽅⾯促使我们能够构建更轻更快的模型(例如MobileNet),⼀⽅⾯促使我们能够构建更深更宽的⽹络(例如Xception),提升模型的容量,打败各种⼤怪兽,欧耶~

本文发布于:2024-09-22 04:37:44,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/475008.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   复杂度   卷积   时间
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议