【CV】CNN 卷积神经网络

Convolutional Neural Network
常见的 CNN
文档
图像的通道数
灰度图的通道数为1,彩色图的通道为3

CNN 基本结构:
输入层
卷积层:对特征进行提取
池化层:对特征进行压缩
全连接层:和传统神经网络一样,用于分类
CNN 的层数 = 卷积层数 + 全连接层数

卷积神经网络和普通神经网络相比,
输入 CNN 的图像为三维图像,即为长、宽、颜色通道数(R、G、B)
CNN 相当于传统神经网络(用于分类)加上了卷积和池化层(对特征的提取和处理)
根据特征进行分类

卷积核(filter)
包含三个参数,长、宽、通道数。其中长宽相等,通道数和输入通道数相等。

卷积过程:
划分图像的区域,用卷积核(filter)扫描区域,卷积得到特征矩阵,三个通道同时进行

卷积核扫描
卷积核与被扫描区域做内积运算,得到一个数值。三个通道相加,再加上 bias 得到最终结果。得到的结果称为特征图(feature map)

多特征图
使用不同卷积核对图片进行扫描得到不同的特征图,特征更丰富。特征图个数称为深度,作为下一层卷积的通道数。提取特征后,各种特征在原图像的位置就没那么重要了。

通道数的确定
第一层通道数为 RGB 三通道,后面卷积层的通道数 = 前一层特征图的总数 = 前一层卷积核个数

CNN 常用参数
输入通道数(in_channels):输入通道数,第一层看输入图片,如果是灰度图则为1,后面的和前一层的 out_channels 一样
输出通道数(out_channels):代表该层用到的卷积核的个数,也代表得到的、传输给下一层的特征图的个数
滑动窗口步长(stride):卷积核每次移动走过的距离。一般设置为1
卷积核尺寸:常用的为 3x3 (不能太大,特征提取不明显)
边缘填充(pad/padding):为了解决区域边缘被扫描的次数较少的问题,在边缘添加一圈 0 ,使得原来的边界不为边界
注:padding = n 意思是在外围加 n 层。若原图 28 x 28,padding = 2,则一条边长度增加 4,尺寸变为 32 x 32
卷积核个数:决定了生成的特征图的数量、下一层的通道数。每个卷积核一定不同
ReLU 激活函数:将特征图上所有负数变为0,正数不变
Dropout:每一层随机丢弃一些神经元防止过拟合

池化层:
对卷积得到的特征进行筛选,筛选出重要的特征,防止过拟合
常用池化方法:
Max Pooling:扫描一定区域,选择区域中的最大值(提取最有用的特征)

网络结构:
卷积(CONV)后面接着 RELU 激活函数,两层该结构,一层池化,重复累加

从池化层进入全连接层前,需要先把三维的数据转化为一维的向量

残差神经网络 Resnet
随着 CNN 层数不断增加,效果不一定会越来越好,是为什么呢?因为某一层可能会效果不好,影响了总体的特征提取效果。Resnet 将其中效果不好的层的权重设置为 0 ,只保留对整体效果有益的层数,从而保证了,层数越多,深度越深,学习效果越好。不过提升程度可能很细微,但是总有提升。

代码

Pillow(PIL) 库:python 图像处理库

tf 实现 CNN

各层输入输出计算

卷积层和池化层计算方法一样,带入公式即可

# 输出图片大小的计算公式为:
inputSize = 28
kernel = 2
stride = 2
padding = 0

outputSize = ((inputSize - kernel + 2 * padding) / stride) + 1
print(outputSize,'\n')

全连接层计算:
若最后一层输出为 10 x 10 x 20 ,则作为全连接层的输入为 10 x 10 x 20 = 2000

批标准化 (Batch Normalization)

Batch Normalization(BN)超详细解析

变体

CNN 是卷积神经网络的总称,按照时间线,给出一些变体

  1. LeNet-5 (1998年): 由Yann LeCun开发,是早期的卷积神经网络,主要用于手写数字识别。LeNet-5被认为是卷积神经网络的先驱之一。

  2. AlexNet (2012年): 由Alex Krizhevsky等人开发,这个模型在2012年的ImageNet挑战赛中取得了突破性的成功,标志着深度学习在视觉领域的崛起。

  3. ZFNet (2013年): 也称为Zeiler&Fergus模型,通过修改AlexNet的结构并使用可视化技术来理解卷积层的工作方式,赢得了2013年ImageNet挑战赛。

  4. GoogLeNet (Inception v1) (2014年): 由Google开发,引入了一种称为“Inception”的新架构,它能够显著减少参数的数量而不牺牲性能。

  5. VGGNet (2014年): 由牛津大学的Visual Geometry Group开发,这个模型以其简单而均一的架构著称,证明了网络的深度是提高性能的关键因素。

  6. ResNet (2015年): 由微软研究院开发,引入了残差学习的概念,使得训练非常深的网络成为可能。ResNet在2015年的ImageNet挑战赛中取得了胜利。

  7. DenseNet (2017年): 引入了密集连接的概念,每一层都与前面的所有层相连,极大地提高了效率和效果。

  8. MobileNet (2017年): 专为移动和嵌入式设备设计,通过使用深度可分离的卷积来减少计算量和模型大小。

  9. EfficientNet (2019年): 使用复合系数对深度、宽度和分辨率进行缩放,创造出一系列模型,这些模型在效率和准确性之间取得了良好的平衡。

  10. Vision Transformer (ViT) (2020年): 将Transformer架构应用于图像分析,这是从自然语言处理领域借鉴过来的技术,开辟了神经网络处理视觉信息的新途径。

LeNet-5

23 经典卷积神经网络 LeNet【动手学深度学习v2】

使用MNIST:28x28,第一层 padding=2,输入网络是 32x32

  1. 输入层(Input Layer):接受的输入图像大小通常是32x32像素。这是因为网络设计时考虑到数字的实际大小和希望网络能够捕捉到重要的特征。

  2. 第一卷积层(C1):这一层使用6个卷积核(或滤波器),每个大小为5x5,步长为1,无填充(padding),输出的特征图(feature map)大小为28x28x6。

  3. 第一下采样层(S2):也称为池化层,使用2x2的窗口进行平均池化,步长为2,将特征图的维度降低到14x14x6。这一步骤有助于减少数据的空间尺寸,从而减少计算量和控制过拟合。

  4. 第二卷积层(C3):这一层有16个卷积核,每个大小为5x5,处理上一层的输出,产生10x10x16的特征图。这一层的设计允许网络学习更高级的特征。

  5. 第二下采样层(S4):同样采用2x2平均池化,步长为2,输出的维度为5x5x16。

  6. 全连接层(F5):这一层有120个节点,它将前一层的输出展平(flatten)并全连接到这120个节点上。这一层开始将学到的特征组合成更高级别的模式。

  7. 第二全连接层(F6):这一层有84个节点,进一步处理特征,为最终的分类决策做准备。

  8. 输出层(Output Layer):最后是一个具有10个节点的输出层,对应于10个数字类(0到9)。这一层通常使用softmax激活函数,将网络的输出转换为概率分布。

两层卷积两层池化,卷积池化之间使用 Sigmoid 激活,最后使用全连接层映射到 10 个分类

AlexNet

AlexNet 在2012年的ImageNet大规模视觉识别挑战(ILSVRC)中取得了冠军。
相比 LeNet,AlexNet 增加了以下部分:

  1. dropout 层

  2. 使用最大池化层

  3. sigmoid 换成 ReLU

  4. 使用了数据增强

    AlexNet的结构大致可以分为以下几个关键部分:

  5. 输入层:AlexNet接受的输入图像大小为227x227x3(宽x高x颜色通道),原论文中提到的是224x224x3,但实际实现时通常使用227x227x3,以适应网络中的卷积层。

  6. 卷积层:AlexNet 包含5个卷积层,其中一些卷积层后面跟有最大池化层。这些卷积层用于提取图像中的特征。第一层使用96个大小为11x11的卷积核,步长为4;第二层使用256个5x5的卷积核,其余层则逐渐减少卷积核的尺寸并增加卷积核的数量。

  7. 激活函数:AlexNet中引入了ReLU(Rectified Linear Unit)作为激活函数,以增加非线性特性并加速训练过程。在每个卷积层和全连接层后都应用了ReLU。

  8. 池化层:使用了3层最大池化层,降低特征的空间维度,减少计算量,并在一定程度上提供平移不变性。

  9. 规范化层:AlexNet在某些卷积层之后引入了局部响应规范化(LRN),这有助于提高泛化能力。但在后来的网络设计中,LRN并不常见,因为被发现效果不如Batch Normalization。

  10. 全连接层:AlexNet的顶部有三个全连接层,每个层都有4096个神经元,最后一个全连接层输出1000个类别的得分,对应于1000个不同的图像类别。

  11. Dropout:在全连接层中,AlexNet使用了Dropout技术来防止模型过拟合。Dropout会在训练过程中随机丢弃一部分神经元,减少神经元之间复杂的共适应关系。

  12. 输出层:使用softmax层作为输出层,将神经网络的输出转换为概率分布,这些概率表示图像属于每个类别的可能性。

AlexNet的成功不仅因为它的网络结构,还因为它使用了多GPU训练和数据增强等技术,显著提高了训练速度和模型的泛化能力。

VGGNet

最初是由牛津大学的视觉几何组(Visual Geometry Group,即VGG)开发的,用于参加2014年的 ImageNet 挑战赛。VGGNet 的关键特点在于其使用了非常深的网络结构来提高图像识别的准确性。

VGGNet 有几个版本,其中最著名的 是VGG16 和 VGG19,数字代表网络中的层数。VGG16 包含16层,VGG19 则包含19层。这些层数主要是卷积层和全连接层。

采用统一的小卷积核(3x3),并通过堆叠多个小卷积层来增加网络的深度和容量,比大卷积核效果更好,提取的特征更细致。

VGG块:图中①就是一个VGG块,包含多层卷积和一个 ReLU 函数

VGGNet 的架构特点包括:

  1. 统一的卷积层设计:VGGNet使用了3x3的小卷积核和1x1的卷积步长,并且在每个卷积层后面使用了 ReLU 激活函数。这种设计使得网络在保持感受野大小的同时能够更深。

  2. 池化层:在连续的卷积层之后,VGGNet 使用最大池化层来逐渐减少特征图的空间尺寸,增加特征的抽象程度。

  3. 全连接层:在卷积层和池化层之后,VGGNet 包含了三个全连接层,最后一层是用于分类的 softmax 层。

  4. 深度:VGGNet 的深度(即层数)是其最显著的特征之一,这使得网络能够学习到更复杂和抽象的特征表示。

VGGNet由于其简单和高效的架构,在图像识别领域获得了广泛的应用,包括图像分类、面部识别和风格迁移等。尽管它的参数量比较大,导致模型较为庞大且计算密集,但它仍然是深度学习和计算机视觉领域的一个重要基准。

ResNet

三分钟说明白ResNet ,关于它的设计、原理、推导及优点
残差神经网络(ResNet)
29 残差网络 ResNet【动手学深度学习v2】

主要用于解决深度卷积神经网络训练过程中遇到的梯度消失和梯度爆炸问题。ResNet通过引入“残差学习”的概念来实现对更深网络的有效训练。

残差块(Residual Block)是ResNet的核心,它允许输入直接通过一条“捷径”(skip connection或shortcut connection)连接到输出,从而实现输入与输出之间的直接相加
f(x)=x+g(x)
这种设计使得网络可以学习到残差映射,即学习到的是输入与输出之间的差异,而不是直接学习一个完整的映射。这样做的好处是可以减轻网络训练中的梯度消失问题,使得网络即使在极深的情况下也能有效训练。

ResNet架构的另一个重要特点是它的模块化设计,使得网络可以很容易地扩展到不同的深度。ResNet的几个变体,如ResNet-50、ResNet-101和ResNet-152,分别包含不同数量的层,适用于不同的任务和性能要求。

拓展

1x1的卷积核有什么用?

虽然在空间尺寸上看起来似乎不会对特征图的空间结构产生影响,但实际上它在深度学习中有几个非常有用的作用:

通道数变换

1x1卷积可以改变特征图的通道数。这对于控制网络的复杂性和参数数量非常有用。例如,可以用它来减少特征图的通道数,从而减少后续层的计算量和参数量(这种操作有时被称为“瓶颈层”),或者增加通道数以提供更丰富的特征表示。

增强非线性

尽管1x1卷积本身是线性的,但在1x1卷积层之后添加非线性激活函数(如ReLU)可以引入额外的非线性,使网络能够学习更复杂的函数。

跨通道信息整合

1x1卷积可以实现特征图不同通道之间的信息整合。由于1x1卷积核作用于特征图的所有通道,它可以学习将不同通道的信息组合在一起的新方式,这有助于网络捕捉跨通道的特征依赖。

计算效率

1x1卷积相对于更大卷积核的卷积操作要更加计算高效。它们可以用来设计更深但计算量不那么大的网络架构,特别是在处理具有大量通道的特征图时。

网络中的“调节阀”

在一些复杂的网络结构中(如Inception模块),1x1卷积被用作调节阀,以控制不同路径上的参数量和计算复杂度。

综上所述,1x1卷积是一个非常强大的工具,它提供了一种简单而有效的方式来增加网络的深度和复杂性,同时控制计算和参数的增长,是现代深度学习架构中不可或缺的一个组件。

赞赏