您现在的位置是:首页 >技术教程 >CNN卷积神经网络网站首页技术教程
CNN卷积神经网络
?大家好,我是一名正在学习机器学习的小白,最近在写一些关于机器学习基础概念的文章。如果你也对机器学习感兴趣,或者想要了解一些基础知识,欢迎来关注我哦!?
CNN,全称为卷积神经网络(Convolutional Neural Network),是一种用于处理具有网格结构数据(如图像、视频和音频)的前馈神经网络。它是深度学习领域中最常用的模型之一,尤其适用于计算机视觉任务。
主要组成部分
卷积层(Convolutional Layers)
卷积层是CNN的核心构建模块,它将滤波器(也称为卷积核)应用于输入数据的局部区域,以提取特征。通过在不同的位置共享参数,卷积层能够有效地捕捉输入数据的局部特征,从而在保留空间结构的同时减少参数量。
卷积操作是深度学习中最常用的操作之一,它在图像处理、语音识别、自然语言处理等领域都有广泛的应用。简单来说,卷积操作就是将一个滤波器(也称为卷积核或者权重)在输入数据上滑动,计算滤波器与输入数据的点积,得到输出数据。
特征图是卷积神经网络中的一种数据结构, 它是卷积层的输出结果。在卷积层中,输入数据通过卷积核进行卷积操作,得到的结果就是特征图。特征图可以看作是对输入数据的一种抽象表示,它包含了输入数据中的各种特征信息,如边缘、纹理、形状等。在卷积神经网络中,特征图是非常重要的中间结果,它会被传递到后续的层中进行处理和提取更高层次的特征。
具体来说,卷积操作的步骤如下:
-
定义滤波器:滤波器是一个小矩阵,通常是3x3或5x5大小的矩阵,其中的每个元素都是一个权重值。
-
将滤波器在输入数据上滑动:滤波器在输入数据上从左到右、从上到下滑动,每次滑动一个像素,计算滤波器与输入数据的点积。
-
计算点积:将滤波器与输入数据对应位置的元素相乘,然后将所有乘积相加,得到一个单一的值,这个值就是输出数据的一个像素值。
-
重复步骤2和3,直到滤波器滑动完整个输入数据,得到输出数据。
卷积操作的本质是一种特殊的线性变换,它可以提取输入数据中的特征信息,例如边缘、纹理、形状等。在深度学习中,卷积操作通常作为神经网络的一层,用于提取输入数据的特征,从而实现分类、识别、分割等任务。
激活函数(Activation Functions)
在卷积层之后,通常会应用非线性激活函数来引入非线性性质。常用的激活函数包括ReLU(Rectified Linear Unit)、Sigmoid和Tanh等,它们能够增强模型的表达能力并引入非线性特征。
CNN的激活函数通常是在卷积层之后的非线性变换中使用的,也就是在卷积层的输出上应用激活函数。这是因为卷积层的输出是一个特征图,其中每个像素都代表了输入图像的某个特征。通过在卷积层之后应用激活函数,可以使得特征图中的每个像素都经过非线性变换,从而增强模型的表达能力,提高模型的性能。常用的激活函数包括ReLU、sigmoid、tanh等。
下面是几个常用的激活函数表达式:
- Sigmoid函数:
σ ( x ) = 1 1 + e − x sigma(x) = frac{1}{1 + e^{-x}} σ(x)=1+e−x1
- ReLU函数:
ReLU ( x ) = max ( 0 , x ) ext{ReLU}(x) = max(0, x) ReLU(x)=max(0,x)
- Leaky ReLU函数:
LeakyReLU ( x ) = { x , if x > 0 α x , otherwise ext{LeakyReLU}(x) = egin{cases} x, & ext{if } x > 0 \ alpha x, & ext{otherwise} end{cases} LeakyReLU(x)={x,αx,if x>0otherwise
其中 α alpha α 是一个小于 1 的常数。
- Tanh函数:
tanh ( x ) = e x − e − x e x + e − x anh(x) = frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x
- Softmax函数:
softmax ( x i ) = e x i ∑ j = 1 K e x j ext{softmax}(x_i) = frac{e^{x_i}}{sum_{j=1}^K e^{x_j}} softmax(xi)=∑j=1Kexjexi
其中 K K K 是类别数, x i x_i xi 是第 i i i 个类别的得分。
为什么激活函数能够引入非线性性质?
激活函数能引入非线性性质的原因是因为它们能够对输入进行非线性变换。在神经网络中,每个神经元都接收到来自前一层的输入,并将这些输入加权求和,然后通过激活函数进行非线性变换,最终输出给下一层。如果没有激活函数,神经网络将只是一系列线性变换的组合,无法学习非线性关系。因此,激活函数的引入使得神经网络可以学习更加复杂的非线性关系,从而提高了其表达能力和性能。
激活函数引入非线性性质的要求是:
-
可微性:激活函数必须是可微的,这是因为在反向传播算法中需要对激活函数求导。
-
非线性:激活函数必须是非线性的,否则多层神经网络就会退化成单层神经网络,失去了表达复杂函数的能力。
-
单调性:激活函数最好是单调的,这样可以保证神经网络的输出是唯一的,避免出现多个局部最优解。
-
饱和性:激活函数的导数不能太小,否则在反向传播算法中梯度会消失,导致训练困难。同时,激活函数的取值范围也不能太大,否则会导致梯度爆炸。
什么是梯度?
梯度是一个向量,它包含了函数在某一点上的所有偏导数。偏导数是指在多元函数中,只对其中一个自变量求导数,而将其他自变量视为常数。梯度的方向是函数在该点上增加最快的方向,梯度的大小是函数在该点上增加的速率。
在机器学习中,梯度通常指的是损失函数对模型参数的偏导数。损失函数是用来衡量模型预测结果与真实结果之间的差距的函数。模型参数是指模型中需要学习的变量,例如神经网络中的权重和偏置。
梯度在机器学习中的作用是优化模型参数,使得损失函数的值最小化。具体来说,我们可以使用梯度下降算法来更新模型参数,使得每次更新后损失函数的值都会减小。梯度下降算法的基本思想是沿着梯度的反方向更新模型参数,以使得损失函数的值不断减小。
需要注意的是,梯度下降算法并不一定能够找到全局最优解,而只能找到局部最优解。此外,梯度下降算法的收敛速度也会受到梯度消失和梯度爆炸等问题的影响。因此,在实际应用中,我们需要采用一些技巧来解决这些问题,例如使用Batch Normalization、使用梯度裁剪等。
梯度消失和梯度爆炸是深度神经网络中常见的问题。梯度消失指的是在反向传播算法中,梯度在传递过程中逐渐变小,最终变得非常小,导致权重更新非常缓慢,甚至无法更新。这种情况通常发生在使用sigmoid或tanh等激活函数时,因为这些函数的导数在输入值很大或很小时会趋近于0,导致梯度消失。梯度爆炸则是梯度在传递过程中逐渐变大,最终变得非常大,导致权重更新非常快,甚至无法收敛。这种情况通常发生在使用ReLU等激活函数时,因为这些函数的导数在输入值很大时会趋近于1,导致梯度爆炸。
为了解决梯度消失和梯度爆炸问题,可以采用一些技巧,例如使用Batch Normalization、使用梯度裁剪等。激活函数的导数不能太小,否则在反向传播算法中梯度会消失,导致训练困难。这是因为在反向传播算法中,每个神经元的误差都是由其输出值和激活函数的导数共同决定的。如果激活函数的导数太小,那么误差信号就会变得非常小,从而导致梯度消失。例如,sigmoid函数在输入值非常大或非常小时,其导数会趋近于0,这就会导致梯度消失。
激活函数的取值范围也不能太大,否则会导致梯度爆炸。这是因为在反向传播算法中,每个神经元的误差都是由其输出值和激活函数的导数共同决定的。如果激活函数的取值范围太大,那么误差信号就会变得非常大,从而导致梯度爆炸。例如,ReLU函数在输入值非常大时,其导数会趋近于1,这就会导致梯度爆炸。
常用的激活函数如sigmoid、ReLU、tanh等都满足以上要求,各自使用情况如下:
-
Sigmoid函数:适用于二分类问题,输出值在0到1之间,可以表示概率。
-
Tanh函数:适用于多分类问题,输出值在-1到1之间,可以表示正负性。
-
ReLU函数:适用于深度学习中的大多数情况,可以有效避免梯度消失问题。
-
Leaky ReLU函数:适用于ReLU函数的缺陷,可以避免神经元死亡问题。
-
ELU函数:适用于ReLU函数的缺陷,可以避免神经元死亡问题,并且可以使输出值在负数区间也有非零梯度。
-
Softmax函数:适用于多分类问题,可以将输出值转化为概率分布。
不同的激活函数适用于不同的场景,需要根据具体问题进行选择。
池化层(Pooling Layers)
池化层是卷积神经网络中的一种常用层,主要作用是对输入的特征图进行下采样,减少特征图的维度,从而减少计算量和参数数量,同时也可以提高模型的鲁棒性和泛化能力。
鲁棒性(Robustness)是指模型对于输入数据的扰动或噪声的抵抗能力。一个鲁棒性强的模型能够在输入数据发生变化时仍然保持较好的性能。
泛化能力(Generalization)是指模型在未见过的数据上的表现能力。一个具有良好泛化能力的模型能够在训练集之外的数据上表现出较好的性能。
在机器学习中,我们通常希望训练出的模型既具有良好的鲁棒性,又具有良好的泛化能力。这样的模型才能够在实际应用中发挥更好的效果。
池化层通常放置在卷积层之后,其作用是对卷积层输出的特征图进行下采样,从而减少特征图的大小和数量。常见的池化操作有最大池化和平均池化两种。
-
最大池化:在每个池化窗口内取最大值作为输出,可以有效地保留图像的边缘信息和纹理特征,同时也可以抑制噪声和冗余信息,从而提高模型的鲁棒性和泛化能力。最大池化的缺点是会丢失一些细节信息,可能会导致模型的精度下降。
-
平均池化:在每个池化窗口内取平均值作为输出,可以有效地减少特征图的大小和数量,从而降低计算量和参数数量。平均池化的缺点是会平滑图像的纹理特征,可能会导致模型的精度下降。
总的来说,池化层可以有效地减少特征图的大小和数量,从而降低计算量和参数数量,提高模型的鲁棒性和泛化能力。最大池化和平均池化各有优缺点,可以根据具体任务和数据集的特点选择合适的池化操作。
全连接层(Fully Connected Layers)
全连接层是神经网络中的一种常见层,也被称为密集连接层或全连接层。它通常是神经网络的最后一层,用于将前面的层的输出转换为最终的输出结果。
全连接层的作用是将前一层的所有神经元与当前层的所有神经元相连接,每个连接都有一个权重,这些权重是在训练过程中学习到的。全连接层的输出是前一层的所有神经元的加权和,加上一个偏置项,然后通过一个激活函数进行非线性变换。
举个例子,假设我们有一个输入向量x,它有n个元素,我们想要将它映射到一个输出向量y,它有m个元素。我们可以使用一个全连接层来实现这个映射。我们可以将输入向量x看作是一个n维列向量,将输出向量y看作是一个m维列向量。我们可以定义一个权重矩阵W,它是一个m×n的矩阵,每个元素表示连接两个神经元之间的权重。我们还可以定义一个偏置向量b,它是一个m维列向量,每个元素表示当前层的偏置项。
然后,我们可以使用以下公式计算全连接层的输出:
y = Wx + b
其中,Wx表示输入向量x与权重矩阵W的乘积,b表示偏置项。最终的输出向量y是通过一个激活函数进行非线性变换得到的。
全连接层的优点是它可以学习到任意复杂的非线性映射,因为它可以使用任意的激活函数。缺点是它需要大量的参数,因为每个神经元都需要与前一层的所有神经元相连接,这会导致过拟合的问题。
训练方法
CNN模型的训练通常使用反向传播算法(Backpropagation)和随机梯度下降(Stochastic Gradient Descent,SGD)方法。
反向传播算法是一种基于链式法则的优化算法,用于计算损失函数对模型参数的梯度。具体来说,反向传播算法将损失函数的梯度从输出层向输入层逐层传递,计算每一层的梯度,并根据梯度更新模型参数。
随机梯度下降是一种基于梯度的优化算法,用于更新模型参数。具体来说,随机梯度下降每次从训练数据中随机选择一个小批量数据(通常大小为32或64),计算该小批量数据的损失函数和梯度,并根据梯度更新模型参数。这个过程不断重复,直到达到预设的训练轮数或者损失函数收敛。
在训练CNN模型时,通常还会使用一些技巧来提高模型的性能,例如:
-
数据增强(Data Augmentation):通过对训练数据进行旋转、平移、缩放等变换,生成更多的训练数据,从而提高模型的泛化能力。
-
Dropout:在训练过程中,随机将一部分神经元的输出置为0,从而减少模型的过拟合。
-
Batch Normalization:在每个小批量数据上对输入进行标准化,从而加速模型的训练和提高模型的泛化能力。
-
学习率调整(Learning Rate Schedule):随着训练的进行,逐渐降低学习率,从而使模型更加稳定和收敛。
常见的CNN模型
- LeNet-5:LeNet-5是最早的卷积神经网络之一,由Yann LeCun等人在1998年提出。它主要用于手写数字识别任务,包含多个卷积层和池化层。
- AlexNet:AlexNet是2012年ImageNet图像分类挑战赛的冠军模型,由Alex Krizhevsky等人提出。它是一个深度的卷积神经网络,包含多个卷积层和全连接层,并且使用ReLU激活函数和Dropout正则化技术。
- VGGNet:VGGNet是由Karen Simonyan和Andrew Zisserman提出的模型,其特点是网络结构非常深,并且使用了很小的卷积核(3x3)。VGGNet的网络结构简单而有效,适用于图像分类任务。
- GoogLeNet(Inception):GoogLeNet是由Google团队提出的模型,是一个非常深的卷积神经网络。它引入了Inception模块,使用不同大小的卷积核进行特征提取,以增加网络的宽度和深度。
- ResNet:ResNet是由Kaiming He等人提出的模型,是一个非常深的卷积神经网络。ResNet通过引入残差连接(residual connections)解决了深层网络训练中的梯度消失问题,使得可以训练更深的网络。
- MobileNet:MobileNet是一种轻量级的卷积神经网络,设计用于移动和嵌入式设备。它使用深度可分离卷积(depthwise separable convolution)来减少计算量,从而在减少模型大小和运行时间的同时保持良好的准确性。
这只是一小部分常见的CNN模型,还有许多其他模型和变体,如ResNeXt、DenseNet、SqueezeNet等。每个模型都有其特定的结构和特点,适用于不同的计算机视觉任务。选择适当的CNN模型取决于任务需求、计算资源和准确性要求等因素
以下是一些关于CNN的顶级学术期刊和会议以及相关代码的参考资料:
学术期刊:
- Journal of Machine Learning Research (JMLR) - http://www.jmlr.org/
- IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI) - https://www.computer.org/csdl/journal/tp
- International Journal of Computer Vision (IJCV) - https://www.springer.com/journal/11263
- arXiv - https://arxiv.org/ (预印本,涵盖广泛的机器学习和计算机视觉研究)
学术会议:
- Conference on Neural Information Processing Systems (NeurIPS) - https://neurips.cc/
- International Conference on Machine Learning (ICML) - https://icml.cc/
- Conference on Computer Vision and Pattern Recognition (CVPR) - http://cvpr2022.thecvf.com/
- European Conference on Computer Vision (ECCV) - https://eccv2022.eu/
代码资源:
- TensorFlow - https://www.tensorflow.org/ (Google开发的深度学习框架,提供了丰富的CNN实现和示例)
- PyTorch - https://pytorch.org/ (Facebook开发的深度学习框架,也提供了许多CNN的代码示例)
- Keras - https://keras.io/ (高级神经网络库,基于TensorFlow或Theano,提供了简单易用的CNN实现)
- Caffe - http://caffe.berkeleyvision.org/ (受欢迎的深度学习框架,支持CNN和计算机视觉任务)
这些顶级期刊和会议是计算机视觉和机器学习领域最权威的出版物,其中的论文提供了关于CNN理论、方法和应用的最新研究。此外,TensorFlow、PyTorch、Keras和Caffe等深度学习框架提供了丰富的文档和示例代码,可以帮助您学习和实现CNN模型。请访问它们的官方网站以获取更多信息和示例代码。
以下是近几年关于CNN手写数字识别的一些论文:
- Cireşan, D., Meier, U., Gambardella, L.M., and Schmidhuber, J. (2012). Deep, Big, Simple Neural Nets for Handwritten Digit Recognition. Neural computation, 22(12), 3207-3220.
- Simard, P.Y., Steinkraus, D., and Platt, J.C. (2003). Best Practices for Convolutional Neural Networks Applied to Visual Document Analysis. Proceedings of the International Conference on Document Analysis and Recognition (ICDAR).
- LeCun, Y., Bottou, L., Bengio, Y., and Haffner, P. (1998). Gradient-Based Learning Applied to Document Recognition. Proceedings of the IEEE, 86(11), 2278-2324.
- Goodfellow, I., Bengio, Y., and Courville, A. (2016). Deep Learning. MIT Press. Chapter 6: Convolutional Networks.
- Liao, S., Chen, Z., and Carneiro, G. (2016). Deep Convolutional Neural Networks for Pedestrian Detection. Pattern Recognition, 63, 424-434.
以下是一些适合新手学习的CNN图像识别的论文:
-
He, K., Zhang, X., Ren, S., & Sun, J. (2020). Deep Residual Learning for Image Recognition. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
-
Tan, M., & Le, Q. V. (2021). EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. Proceedings of the International Conference on Machine Learning (ICML).
-
Zhou, B., Khosla, A., Lapedriza, A., Oliva, A., & Torralba, A. (2021). Learning Deep Features for Discriminative Localization. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
-
Xie, S., Girshick, R., Dollár, P., Tu, Z., & He, K. (2020). Aggregated Residual Transformations for Deep Neural Networks. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
-
Chen, Z., Zhu, Y., Liu, X., & Yang, M. H. (2020). Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR).