这里是Datawhale的组队学习活动,主要介绍的是模型压缩技术。后续将以CNN网络为基础点,带领大家领略模型压缩的魅力。首先是回顾一下一些关于CNN的基础知识。
参考链接:
模型减肥秘籍:模型压缩技术-课程详情 | Datawhale
datawhalechina/leedl-tutorial: 《李宏毅深度学习教程》(李宏毅老师推荐👍,苹果书🍎),PDF下载地址:https://github.com/datawhalechina/leedl-tutorial/releases
CNN介绍
CNN网络,即卷积神经网络(Convolutional Neural Network),是一类特别为处理具有类似网格结构的数据设计的深度学习网络,比如图像(2D网格)和声音信号(1D网格)。CNN在图像和视频识别、图像分类、医学图像分析等领域取得了显著的成功。
核心组成
CNN的核心思想是利用卷积层来自动并有效地提取输入数据的特征,无需手动特征提取。这些特征通过网络的多个层次被逐渐抽象和组合,用以执行分类、检测或分割等任务。CNN通常包含以下类型的层:
-
卷积层(Convolutional Layers): 这些层通过卷积运算提取输入数据的局部特征,每个卷积层有多个卷积核(Kernel),能够产生不同的特征图(Feature Maps)。
-
激活层(Activation Layers): 通常跟在卷积层后面,引入非线性,使得网络可以学习更加复杂的特征。最常用的激活函数是ReLU(Rectified Linear Unit)。
-
池化层(Pooling Layers): 这些层用于降低特征图的空间尺寸,减少后续层的参数数量和计算量,同时使特征检测变得更加稳定。
-
全连接层(Fully Connected Layers): 通常位于CNN的末端,将卷积层或池化层输出的高维特征向量转换为最终的输出,如分类标签。
优点
CNN通过层的叠加和组合,能够自动并有效地从原始数据中学习到有用的特征表示,避免了传统机器学习方法中手工特征提取的繁琐过程。具有如下优点:
- 局部连接:卷积层中的神经元仅与输入数据的一个局部区域相连接,这使得网络专注于局部特征,并增强了模型的空间利用率。
- 参数共享:通过卷积层中的卷积核重复使用同一组参数,CNN能够以较少的参数量处理大规模输入数据。
- 平移不变性:通过池化层,CNN能够对输入数据的小范围平移保持不变性,这对于识别图像中的对象特别重要。
这三个优点其实也对应了图像识别中的三个观察:
观察 1:检测模式不需要整张图像
神经元不需要把整张图像当作输入, 只需要把图像的一小部分当作输入,就足以让它们检测某些特别关键的模式是否出现,而不用采取全连接的方式将整个图像传入神经元。
简化 1:感受野
根据观察1 可以做第1个简化,卷积神经网络会设定一个区域,即感受野(receptive f ield),每个神经元都只关心自己的感受野里面发生的事情。
观察 2:同样的模式可能会出现在图像的不同区域
第2个观察是同样的模式,可能会出现在图像的不同区域。比如说模式鸟嘴,它可能出 现在图像的左上角,也可能出现在图像的中间。
简化 2:共享参数
既然要检测的模式是一样的,只是检测的区域不同,那么其实可以共享神经元的参数。
上面感受野的第1个神经元会跟下面感受野的第1个神经元共 用参数,上面感受野的第2个神经元跟下面感受野的第2个神经元共用参数······ 所以每个 感受野都只有一组参数而已,这些参数称为滤波器(filter)。
接下来通过另一个角度来说明卷积神经网络。一个卷积层里面就是有一排的滤波器,每个滤波器都是一 个3×3×通道,其作用是要去图像里面检测某个模式。这些模式要在3×3×通道,这个小 的范围内,它才能够被这些滤波器检测出来。
滤波器就是一个一个的张量,这些张量里面的数值就是模型里面的参数。这些滤波器里面的 数值其实是未知的,它是可以通过学习找出来的。
第1个版本的故事里面说 到了有一些神经元,这些神经元会共用参数,这些共用的参数就是第2个版本的故事里面的滤波器。
在第1个版本的故事里面,不同的神经元可以共享权重,去守备不同的 范围。而共享权重其实就是用滤波器扫过一张图像,这个过程就是卷积。这就是卷积层名字的来。把滤波器扫过图像就相当于不同的感受野神经元可以共用参数,这组共用的参数就叫做一个滤波器。
观察 3:下采样不影响模式检测
把一张比较大的图像做下采样(downsampling), 把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的1/4,但是不会影响里面是什么东西。例如,把一张大的鸟的图像缩小,这张小的图像还是一只鸟。
简化 3:汇聚
根据第3个观察,汇聚被用到了图像识别中。汇聚没有参数,所以它不是一个层,它里面 没有权重,它没有要学习的东西,汇聚比较像Sigmoid、ReLU等激活函数。因为它里面是没 有要学习的参数的,它就是一个操作符(operator),其行为都是固定好的,不需要根据数据 学任何东西。每个滤波器都产生一组数字,要做汇聚的时候,把这些数字分组,可以2×2个 一组,3×3、4×4也可以,这个是我们自己决定的,图4.27中的例子是2×2个一组。汇聚 有很多不同的版本,以最大汇聚(max pooling)为例。最大汇聚在每一组里面选一个代表, 选的代表就是最大的一个,如图4.28所示。除了最大汇聚,还有平均汇聚(meanpooling), 平均汇聚是取每一组的平均值。
一个经典的CNN网络架构如下,是不是对其中的不同层有了更深理解了呢。