一、认识CNN卷积神经网络
卷积神经网络(Convolutional Neural Network,CNN)是一种用于处理图像和其他多维数据的深度学习模型。它在计算机视觉任务中表现出色,如图像分类、目标检测、语义分割等。CNN的核心思想是利用卷积操作来提取图像的特征,并通过层层堆叠的方式进行深度学习。以下是CNN的主要组成部分和工作原理:
卷积层(Convolutional Layer)
卷积操作是CNN的核心,它通过滑动一个小的滤波器(也称为卷积核)在输入数据上提取特征。卷积操作会计算每个滤波器与输入数据的点积,生成一个特征图。
多个不同的滤波器用于捕捉不同的特征,例如边缘、纹理等。
池化层(Pooling Layer)
池化操作用于减小特征图的尺寸并降低计算复杂度。常见的池化操作包括最大池化和平均池化,它们分别取特征图中一定区域的最大值或平均值作为新的特征图元素。
激活函数(Activation Function)
卷积层和池化层后通常会添加激活函数,如ReLU(Rectified Linear Unit),用于引入非线性特性。激活函数有助于网络学习复杂的特征。
全连接层(Fully Connected Layer)
在卷积和池化层之后,通常会有一个或多个全连接层,将特征图展平并连接到神经元。这些层用于最终的分类或回归任务。
输出层(Output Layer)
输出层的结构取决于具体的任务。对于分类任务,通常使用softmax激活函数来输出类别概率分布。
发展到现在一个完整的CNN结构是由多个1)卷积层,2)降采样层,3)激活函数层,4)标准化层,5)全连接层和6)扔掉层 有序地拼接而成的
import tensorflow as tf
from tensorflow.keras import layers,models
# 创建CNN模型
model = models.Sequential([# 第一个卷积层
layers.Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3))layers.MaxPooling2D((2,2)),
# 第二个卷积层
layers.Conv2D(64,(3,3),activation='relu')layers.MaxPooling2D((2,2)),
# 第三个卷积层
layers.Conv2D(128,(3,3),activation='relu')layers.MaxPooling2D((2,2))# 全连接层
layers.Flatten()
layers.Dense(128,activation='relu')layers.Dense(1,activation='sigmoid') # 二分类任务,使用sigmoid激活函数
# 编译模型
model.compile(optimizer='adam'
l0ss='binary_crossentropy',# 二分类交叉熵损失metrics=['accuracy'])
# 训练模型
history = model.fit(train data,train labels,epochs=10
validation data=(test data,test labels))
# 评估模型性能
test loss,test acc = model.evaluate(test data, test labels)print(f'Test accuracy:{test acc}')
# 可以使用训练好的模型进行图像分类预测
predictions = model.predict(new images)
数学概念和公式
深度认识CNN卷积神经网络,核心点就是用一些数学技巧,很依赖于向量微积分(Vector Calculus)和链式法则(ChainRule),来帮我们弄明白函数之间的关系。这样,就能算出怎么调整网络的参数,让它更聪明。
CNN(Convolutional NeuralNetworks)运作背后的一些关键数学知识主要是关于张量(tensor)怎么表示和变成一行的事情、用向量(vector)来算微积分,还有个叫链式法则(chain rule)的东西。
简单说,张量就是用来描述那些很复杂的数据,把它们变成一行(vectorization)方便计算。链式法则,就是帮我们算出一个函数里另一个函数的导数,这个在深度学习(deeplearning)反推算法(backpropagationalgorithm)里超重要。这些点子帮我们搞懂CNN怎么在图像处理(imageprocessing)和识别模式(patternrecognition)上发挥作用。
链式法则(chain rule)
如果z是y的函数,那么z对y的偏导数也是一个向量,定义为:
进一步假设xERW 是另一个向量,并且y是x的函数。那么,y相对于x的偏导数被定义为:
z是x的函数,这是一个链式的关系:一个函数将x映射到y,另一个函数将y映射到z。链式法则可以用来计算
如果你有个单独的数,我们称它为标量(Scalar) z,它依赖于一个向量(Vector) y,那么z随着y里每个小部分变化的速率,也就是偏导数(PartialDerivatives),也能组成一个向量。
如果y又依赖于另一个向量x,那它们之间的关系可以用一个矩阵(Matrix)来描述。链式法则帮我们连起来这些关系,找出z对x的变化速率。这是反向传播算法(BackpropagationAlgorithm)的大脑中枢,用来微调CNN里的参数。
基础架构与层级处理
在探索深度学习(Deep Learning)和卷积神经网络(Convolutional Neural Network, CNN)的世界时,我们通常会遇到一系列复杂但精妙的概念,其中基础架构(Architecture)和层级处理(Layer Processing)是核心组成部分。
基础架构指的是网络的整体设计,包括不同类型的层,如卷积层(Convolutional Layers)、池化层(Pooling Layers)和全连接层(Fully Connected Layers)等,它们共同定义了数据如何被处理和转换。卷积层的个数、降采样层的个数、卷积核的尺寸、卷积核的个数这些网络细节会对最后的训练结果产生什么了不得的影响,这些就按照你的输入图像的尺寸来就行了
层级处理则涉及到数据在这些层中的具体流动和转化过程,从输入到输出,每一层都对数据执行特定的操作,逐步提取特征并做出预测。通过理解这两个概念,我们可以更好地把握深度学习模型的工作原理,以及它们是如何通过学习数据的表示来执行复杂任务的
卷积层的个数、降采样层的个数、卷积核的尺寸、卷积核的个数这些网络细节不会对最后的训练结果产生什么关键性的影响,设计的标准就是输入图像的尺寸
LeNet-5模型
LeNet是一种早期的卷积神经网络(CNN),由Yann LeCun等人在1998年提出,主要用于手写数字识别(如MNIST数据集)。LeNet在深度学习的发展历史中具有里程碑意义,以下是LeNet的详细介绍:
网络架构
LeNet5是最著名的LeNet变种,其网络架构包含7层,包括卷积层、池化层和全连接层。具体结构如下:
1. 输入层:图像尺寸为32x32x1(宽、高、灰度图像)。
2. 卷积层1:
卷积核大小:5x5
步幅:1
输出通道数:6
激活函数:Tanh
输出尺寸:28x28x6
3. 池化层1(平均池化):
池化大小:2x2
步幅:2
输出尺寸:14x14x6
4. 卷积层2:
卷积核大小:5x5
步幅:1
输出通道数:16
激活函数:Tanh
输出尺寸:10x10x16
5. 池化层2(平均池化):
池化大小:2x2
步幅:2
输出尺寸:5x5x16
6. 卷积层3:
卷积核大小:5x5
步幅:1
输出通道数:120
激活函数:Tanh
输出尺寸:1x1x120
7. 全连接层1:
神经元数:84
激活函数:Tanh
8. 全连接层2(输出层):
神经元数:10(与MNIST数据集的类别数相同)
激活函数:Softmax
特点与创新
卷积层和池化层的组合:LeNet使用卷积层和池化层的组合来提取特征,减少了参数数量并增加了计算效率。
共享权重和局部连接:通过共享权重和局部连接,LeNet减少了参数数量,增强了模型的泛化能力。
激活函数:最初使用的是sigmoid函数,后续版本中改为Tanh函数,帮助模型更好地训练。
AlexNet
AlexNet是一种深度卷积神经网络(CNN),由Alex Krizhevsky等人在2012年的ImageNet比赛中首次提出。它在该比赛中获得了显著的成绩,标志着深度学习在计算机视觉领域的突破。
想象一下,你有一堆猫猫的照片,想要让电脑能自动告诉你每张照片里是什么品种的猫。有了AlexNet这样的卷积神经网络(Convolutional Neural Network, CNN)架构,这个任务就变得可行并且准确度大大提高了。
AlexNet,这个名字听起来可能有点像是个朋友的名字,但它实际上是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton三位大佬在2012年开发的一个超级强大的图像识别工具。它在ImageNet这个巨大的图像数据集(dataset)上大放异彩,打败了许多传统的机器学习方法,可以说是深度学习(Deep Learning)和计算机视觉(Computer Vision)领域的一大突破。
AlexNet的魔力在于它的层次结构,包括卷积层(Convolutional Layers)来识别图像中的各种形状和纹理,最大池化层(Max Pooling Layers)来减少计算量同时保留重要特征,以及全连接层(Fully Connected Layers)来最终决定看到的是哪种猫。
用一个识别猫猫的例子来说,你只需把猫猫的照片输入AlexNet,它就会通过这些层次一步步分析,从最简单的特征开始,比如边缘和颜色,到更复杂的特征,比如毛发纹理或者是猫的姿态。在这个过程中,AlexNet就像是在不断地学习和理解什么是猫,最终能告诉你这是一只什么品种的猫。
网络架构
AlexNet的网络架构包含8层,包括5个卷积层和3个全连接层。学习参数有6千万个,神经元有650,000个其主要结构如下:
1. 输入层:图像尺寸为224x224x3(宽、高、颜色通道数)。
2. 卷积层1:
卷积核大小:11x11
步幅:4
输出通道数:96
激活函数:ReLU
输出尺寸:55x55x96
3. 池化层1(最大池化):
池化大小:3x3
步幅:2
输出尺寸:27x27x96
4. 卷积层2:
卷积核大小:5x5
输出通道数:256
激活函数:ReLU
输出尺寸:27x27x256
5. 池化层2(最大池化):
池化大小:3x3
步幅:2
输出尺寸:13x13x256
6. 卷积层3:
卷积核大小:3x3
输出通道数:384
激活函数:ReLU
输出尺寸:13x13x384
7. 卷积层4:
卷积核大小:3x3
输出通道数:384
激活函数:ReLU
输出尺寸:13x13x384
8. 卷积层5:
卷积核大小:3x3
输出通道数:256
激活函数:ReLU
输出尺寸:13x13x256
9. 池化层3(最大池化):
池化大小:3x3
步幅:2
输出尺寸:6x6x256
10. 全连接层1:
神经元数:4096
激活函数:ReLU
11. 全连接层2:
神经元数:4096
激活函数:ReLU
12. 全连接层3(输出层):
神经元数:1000(与ImageNet数据集的类别数相同)
激活函数:Softmax
AlexNet的前5层基本上是卷积块,最初也是用于手写和语言处理
特点与创新
ReLU激活函数:ReLU在每个卷积层以及全连接层后,AlexNet使用ReLU激活函数,解决了深度神经网络中的梯度消失问题。
GPU加速:在训练过程中使用了GPU加速,提高了训练速度。AlexNet在两个GPU上运行:
在第2,4,5层均是前一层自己GPU内连接,第3层是与前面两层全连接,全连接是2个GPU全连接;
RPN层第1,2个卷积层后;
ReLU、双GPU运算:提高训练速度。(应用于所有卷积层和全连接层)
数据增强:使用了数据增强技术,如水平翻转、裁剪和颜色抖动,提高了模型的泛化能力。
Dropout:在全连接层中使用了Dropout技术,减少了过拟合的风险。
Max pooling层在RPN层以及第5个卷积层后。
重叠pool池化层:提高精度,不容易产生过度拟合。(应用在第一层,第二层,第五层后面)
局部响应归一化层(LRN):提高精度。(应用在第一层和第二层后面)
然而他确是一种古老的人工智能思想的视线,即人工神经网络。算法的行为几乎完全是从数据中学习的网络。数据和一组权重之间的点积运算。
LeNet和AlexNet区别
LeNet是较早期的CNN架构,简单、参数少,适合基础任务和低资源环境。
AlexNet则是深度学习在计算机视觉领域的重要突破,复杂、参数多,适合处理大规模、复杂的图像分类任务,并且在其后的深度学习发展中起到了重要的推动作用。
架构和层数
1. LeNet5:
层数:7层(包括输入层)
卷积层:2个
池化层:2个
全连接层:2个
激活函数:Tanh
输出层:Softmax
2. AlexNet:
层数:8层(包括输入层)
卷积层:5个
池化层:3个
全连接层:3个
激活函数:ReLU
输出层:Softmax
复杂性和参数数量
LeNet:
参数较少,适用于简单任务,如手写数字识别。
网络较浅,计算量较低,适合低资源环境。
AlexNet:
参数更多,适用于复杂任务,如大型图像分类。
网络较深,计算量大,需要GPU加速训练。
输入图像尺寸
LeNet:
32x32的灰度图像(单通道)。
AlexNet:
224x224的彩色图像(三通道)。
数据增强和正则化
LeNet:
无数据增强。
无Dropout。
AlexNet:
使用数据增强(如水平翻转、裁剪、颜色抖动)。
使用Dropout减少过拟合。
激活函数
LeNet:
使用Tanh激活函数。
AlexNet:
使用ReLU激活函数,解决了梯度消失问题,提高了训练速度。
应用场景
LeNet:
主要用于手写数字识别(如MNIST数据集)。
AlexNet:
用于更广泛的图像分类任务(如ImageNet数据集),推动了计算机视觉领域的发展。