卷积神经网络是一种强大的人工神经网络技术。
这些网络能够保留问题的空间结构,并且最初是为了对象识别任务(如手写数字识别)而开发的。它们之所以流行,是因为人们可以在具有挑战性的计算机视觉和自然语言处理任务上取得最先进的结果。
在本文中,您将了解用于深度学习的卷积神经网络,也称为 ConvNets 或 CNNs。完成本次速成班后,您将了解:
- CNN 中使用的构建模块,例如卷积层和池化层。
- 构建模块如何组合在一起,并附有简短的实际示例。
- 在对象识别任务上配置 CNN 的最佳实践。
- 有关应用于复杂机器学习问题的最先进网络的参考资料。
通过我的新书 《Python深度学习》 快速启动您的项目,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。

卷积神经网络机器学习速成班
照片由 Bryan Ledgard 拍摄,保留部分权利。
卷积神经网络的论据
给定一个包含 32x32 像素的标准化尺寸的灰度图像数据集,传统的前馈神经网络将需要 1024 个输入权重(外加一个偏置)。
这本身是可以的,但是将图像像素矩阵展平成长向量会丢失图像中的所有空间结构。除非所有图像都经过完美缩放,否则神经网络在处理该问题时将遇到很大困难。
卷积神经网络通过使用小块输入数据学习内部特征表示来期望并保留像素之间的空间关系。特征被学习并应用于整个图像,允许图像中的对象在场景中移动或平移,但仍可被网络检测到。
这就是为什么该网络对于照片中的对象识别、识别数字、面孔、物体等具有各种方向非常有用。
总而言之,以下是使用卷积神经网络的一些好处:
- 与全连接网络相比,它们使用的参数(权重)更少。
- 它们被设计成对场景中的对象位置和形变具有不变性。
- 它们可以自动从输入域学习和泛化特征。
Python 深度学习需要帮助吗?
参加我的免费为期两周的电子邮件课程,发现 MLP、CNN 和 LSTM(附代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
卷积神经网络的构建模块
卷积神经网络中有三种类型的层:
- 卷积层
- 池化层
- 全连接层
1. 卷积层
卷积层由滤波器和特征图组成。
滤波器
滤波器是该层的“神经元”。它们接收加权输入并输出一个值。输入尺寸是一个固定大小的正方形,称为块或感受野。
如果卷积层是输入层,则输入块将是像素值。如果在网络架构的更深层,则卷积层将接收来自前一层特征图的输入。
特征图
特征图是应用于前一层的单个滤波器的输出。
给定的滤波器会跨越前一层绘制,一次移动一个像素。每个位置都会激活神经元,输出被收集到特征图中。可以看到,如果感受野从一个激活移动到下一个激活一个像素,那么感受野将与前一个激活重叠 (场宽 - 1) 个输入值。
零填充
滤波器在输入层上移动以进行每次激活的距离称为步幅。
如果前一层的大小不能被滤波器的感受野大小和步幅大小整除,那么感受野可能会尝试超出输入特征图的边缘。在这种情况下,可以使用零填充等技术来创建模拟输入供感受野读取。
2. 池化层
池化层会缩小前一层特征图的尺寸。
池化层紧随一个或多个卷积层之后,旨在巩固在前一层特征图中学习和表达的特征。因此,池化可以被视为一种压缩或泛化特征表示的技术,并且通常会减少模型对训练数据的过拟合。
它们也有感受野,通常比卷积层小得多。此外,为了避免任何重叠,步幅或感受野每次激活移动的输入数量通常等于感受野的大小。
池化层通常非常简单,通过取输入值的平均值或最大值来创建自己的特征图。
有关池化层的更多信息,请参阅本文。
3. 全连接层
全连接层是正常的扁平前馈神经网络层。
这些层可能有一个非线性激活函数或 softmax 激活,以输出类预测的概率。
在经过卷积层和池化层的特征提取和整合后,全连接层通常用于网络的末端。它们用于创建最终的非线性特征组合,并用于网络的预测。
卷积神经网络工作示例
您现在已经了解了卷积层、池化层和全连接层。让我们通过工作示例来具体说明这三个层如何连接在一起。
1. 图像输入数据
假设您有一个灰度图像数据集。每张图像的大小均为 32 像素宽,32 像素高,像素值在 0 到 255 之间,例如,一个 32x32x1 的矩阵或 1024 个像素值。
图像输入数据表示为宽度*高度*通道的 3 维矩阵。如果您在示例中使用彩色图像,您将为红色、绿色和蓝色像素值提供三个通道,例如 32x32x3。
2. 卷积层
定义一个卷积层,包含十个滤波器,感受野为 5x5 像素,步幅长度为 1。
由于每个滤波器一次只能接收来自 5x5 或 25 个像素的输入(即“看到”),您可以计算每个滤波器需要 25 + 1 个输入权重(外加 1 个偏置输入)。
将 5x5 感受野以 1 的步幅宽度跨越输入图像数据,将生成一个 28x28 的特征图输出值,即每个图像 784 个不同的激活值。
您有十个滤波器,因此对于一张图像将创建十个不同的 28x28 特征图,即 7,840 个输出。
最后,您知道每个滤波器有 26 个输入,有十个滤波器,每个滤波器要计算 28x28 的输出值。因此,如果您想用传统的神经网络术语来表述,在卷积层中总共有 26x10x28x28 或 203,840 个“连接”。
卷积层还使用非线性激活函数作为激活的一部分,并且整流器激活函数是流行的默认选择。
3. 池化层
您可以定义一个池化层,其感受野宽度为 2 个输入,高度为 2 个输入。您还可以使用步幅为 2,以确保没有重叠。
这将产生尺寸为输入特征图一半的特征图,从十个不同的 28x28 特征图输入到十个不同的 14x14 特征图输出。
我们将为每个感受野使用 max() 操作,以便激活值是输入值中的最大值。
4. 全连接层
最后,您可以将方形特征图展平为传统的扁平全连接层。
您可以定义一个包含 200 个隐藏神经元的全连接层,每个神经元有 10x14x14 个输入连接,即每个神经元 1960 + 1 个权重。该层总共有 392,200 个连接和权重需要学习。
您可以使用 sigmoid 或 softmax 激活函数直接输出类别值的概率。
卷积神经网络 最佳实践
现在您已经了解了卷积神经网络的构建模块以及各层如何协同工作,您可以回顾一些在应用它们时需要考虑的最佳实践。
- 输入感受野维度:默认值为 2D 用于图像,但对于句子中的单词可以是 1D,或对于视频可以是 3D,增加了时间维度。
- 感受野大小:块应尽可能小,但要足够大以“看到”输入数据中的特征。在小图像上通常使用 3x3,在较大图像尺寸上使用 5x5 或 7x7 及以上。
- 步幅宽度:使用默认步幅 1。它易于理解,并且您不需要填充来处理感受野落在图像边缘的情况。对于较大的图像,可以将其增加到 2 或更大。
- 滤波器数量:滤波器是特征检测器。通常,输入层使用的滤波器较少,而更深的层使用的滤波器越来越多。
- 填充:设置为零,并在读取非输入数据时称为零填充。当您无法或不想标准化输入图像大小时,或者当您想使用不完全整除输入图像大小的感受野和步幅大小时,这非常有用。
- 池化:池化是一种破坏性或泛化过程,用于减少过拟合。感受野几乎总是设置为 2x2,步幅为 2,以丢弃前一层输出 75% 的激活值。
- 数据 准备:考虑标准化输入数据,包括图像的维度和像素值。
- 模式架构:在网络架构中对层进行模式化是很常见的。这可能是一个、两个或几个卷积层,然后是一个池化层。然后可以重复此结构一次或多次。最后,全连接层通常只在输出端使用,并且可以堆叠一层、两层或更多层。
- Dropout:CNN 容易过拟合,即使有池化层。应该使用 Dropout,例如在全连接层之间,或许在池化层之后。
您是否知道更多使用 CNN 的最佳实践?
请在评论中告诉我。
卷积神经网络进阶阅读
您对卷积神经网络的了解仅仅是冰山一角。该领域发展迅速,新的、有趣的架构和技术一直在被讨论和使用。
如果您想对该技术有更深入的了解,请参阅 LeCun 等人的开创性论文《基于梯度的学习应用于文档识别》[PDF]。在其中,他们介绍了应用于手写数字识别的 LeNet,并详细解释了各层以及网络的连接方式。
网上有很多关于 CNN 的教程和讨论。以下是一些精选示例。就个人而言,我发现这些帖子的解释性图片是在理解网络如何工作之后才更有用。许多解释令人困惑,并在不确定时将您引向 LeCun 的论文。
- DeepLearning4J 中的卷积网络
- 斯坦福 CS231n 课程中的卷积网络模型
- 视觉中的卷积网络和应用 [PDF]
- Michael Nielsen 的在线深度学习书籍第 6 章
- 牛津 VGG 卷积神经网络实践
- Denny Britz 的《理解用于 NLP 的卷积神经网络》
总结
在本文中,您了解了卷积神经网络。您学习了:
- 为什么需要 CNN 来保留输入数据的空间结构以及它们提供的优势。
- CNN 的构建模块包括卷积层、池化层和全连接层。
- CNN 中各层的连接方式。
- 将 CNN 应用于您自己问题时的最佳实践。
您对卷积神经网络或本文有任何疑问吗?请在评论中提问,我将尽力回答。
感谢您有用的帖子。我认为下载您的 PDF 有问题。您能检查一下吗?谢谢!
您可以通过点击“下载按钮”,输入您的电子邮件地址,点击“立即下载”按钮,然后检查您的电子邮件,在那里您将获得 PDF 的链接来下载深度学习迷你课程。
我刚刚再次检查了流程,一切似乎都工作正常。也许可以再试一次,或者在不同的电脑或浏览器上试试?
CNN 是否可以用于非 2D 问题,例如一般的回归问题?如果可以,您能提供一个代码示例吗?
也许可以,ana。
您也许可以使用 CNN 前置 LSTM 来学习序列数据的空间结构。
这里有一个相关的序列分类示例,您可以将其作为起点。
https://machinelearning.org.cn/sequence-classification-lstm-recurrent-neural-networks-python-keras/
您好,我需要一些建议。您认为 LeCun 的论文“基于梯度的学习应用于文档识别”是否值得阅读,以便了解图像识别(如手势)的知识?或者它是否只适用于文档识别?这是一篇 46 页的论文,所以我想先确定我是否在阅读正确的论文。谢谢!
通常,我会建议阅读与您的问题直接相关的材料,甚至可以重现现有工作,以帮助您尽快获得“有效结果”,然后再尝试改进它。
我明白了,谢谢您!
Jason 您好,我只是想知道为什么您为全连接层选择了 200 个神经元?这里的神经元数量是否对应于您要分类的类别的数量?谢谢!
Amy,问得好。
我通过一些试错来选择神经元数量。没有关于配置神经网络的好理论,这是该学科的“艺术”或经验部分,造成了很多困难。
啊,我明白了。所以我想这是个熟能生巧的问题。
只是确认一下,输出层是否仍应对应于我们要分类的类别数量?
是的,Amy,两点都正确。
Jason 您好,我看到了您对 Amy 的回答,但我仍然很困惑。所以您只有一个隐藏层,有 200 个神经元?我可以问您在这里解决什么问题吗?这是图像分类问题吗?从描述来看,您似乎有 200 个类别。但是,如果是这样,它应该是固定的吗?您还提到您是在试错后选择的,这让您感觉全连接层之后还有另一层?请帮忙,谢谢:)
也许这个教程会有帮助
https://machinelearning.org.cn/pooling-layers-for-convolutional-neural-networks/
嗨,Jason,
您能否建议我如何从 CNN 获取 2 通道的输出?我的意思是输出应该是 2*64*64,其中 64*64 是图像的尺寸,2 是通道数。我对 cnn 是新手,所以请帮帮我。我可以制作 h*w 的 2 维输出,但对于只有 1 个通道,我不明白如何为 2 个通道做到这一点。
本教程可能会为您提供一个很好的起点,您可以将其从 3 个通道改编为 2 个。
https://machinelearning.org.cn/object-recognition-convolutional-neural-networks-keras-deep-learning-library/
感谢您的精彩解释。
我是新手,正在尝试构建 CNN 来对 3000 个样本的 32x32 二进制图像进行 4 种模式分类。我使用了 Python 中的 Keras。
我的模型是:
1.64 个 3x3 滤波器,2x2 最大池化
2.128 个 3x3 滤波器,2x2 最大池化
3. 256 个 3x3 滤波器,2x2 最大池化
4. 具有 256 个输出的全连接层
5. 具有 4 个输出的输出层
但我出现了欠拟合,训练准确率约为 65%,验证准确率约为 85%。
您能告诉我该怎么做来改进我的模型吗?
感谢您的时间。
Moyo
请参阅这篇充满如何获得更好性能的想法的帖子。
https://machinelearning.org.cn/improve-deep-learning-performance/
先生,您能发布一个关于构建 RBF 神经网络的教程吗?
也许将来会。
Jason 您好,如果 CNN 中有很多卷积层和池化层,并且每个卷积层都有一些特征图,我想知道卷积层如何与其他卷积层连接,我的意思是这一层的特征图是否完全连接到上一层的所有特征图,或者只连接到其中一些特征图?
卷积层连接到池化层,池化层连接到卷积层,依此类推。
您的帖子非常棒。非常感谢您的分享。
谢谢,很高兴它们有帮助!
嗨,Jason,
我正在尝试用 TF 构建一个卷积神经网络。但是,似乎 TensorFlow 网站上发布的演示程序存在一些编译问题。您能提供一个简单的 TF 代码来构建 CNN 作为参考吗?
此致
Prabir
感谢您的建议。我这里有 Keras 的示例。
https://machinelearning.org.cn/start-here/#deeplearning
嗨,Jason!
我对 CNN 是新手,只是想知道在进行反向传播时,是否只有最后隐藏层的权重和滤波器矩阵被优化?
我们将跨所有层执行反向传播。也许我不理解您的问题?
先生,我是您的忠实粉丝。我购买了您的一本关于机器学习算法的书。您解释的方式很好,非常棒……我现在准备购买您另一本关于深度学习的书……在系统上实现深度学习方面,我完全处于迷茫状态,是买笔记本电脑还是台式机。您能就深度学习在笔记本电脑或台式机上的实现给我一些建议吗???
谢谢您……
再次感谢!
总的来说,我不认为这有什么区别。您可以本地开发,然后在 AWS 上运行大型模型。这正是我所做的。
好的,先生……。
您有没有写一本关于使用 Python 进行信号处理的书????
目前还没有,也许将来会有?
请推荐一本关于使用信号处理中的变换进行图像特征提取的好书……谢谢您,先生。
抱歉,我没有关于该主题的材料。
先生,我们可以在图像分类中使用进化算法吗?
谢谢……。
也许您可以使用进化算法来学习一个分类器,但您仍然需要选择分类器的形式。
感谢您的回复,
“保留其数据的空间结构”是什么意思?
不客气。
空间结构是指数据中对模型有意义的关系或“结构”。
感谢精彩的教程!
我一直在尝试解决一个问题,但一直没有成功。有一个文本文件,其中的所有空格都被删除了。因此,任务是恢复它们。
我的策略是根据输入预测下一个字母,如果模型预测到空格,则将其插入字符串。我在普通文本集上训练了许多 RNN 模型,最好的结果是双向 LSTM。但结果仍然很糟糕(除了逗号、大写字母和一些短模式周围的空格)。所以也许我的整个方法都是错误的?我发现卷积网络可以在字符级别用于一些有趣的 NLP 任务。是否值得一试,或者我应该改进 RNN 模型,或者也许使用其他东西。您建议对此类任务采取什么方法?
感谢您的时间。
是的,我会从 LSTM 开始。
抱歉,我有一个疑问。是否可以将 CNN 用于非图像数据集,特别是学生数据集?例如,使用平均成绩、入学年份、收入水平、婚姻状况等属性。我也使用过传统的机器学习技术,但我想尝试深度学习技术。你能帮帮我吗?谢谢!
是的,CNN 非常适合文本数据和其他具有空间关系输入的其他数据。
如果数据没有空间关系,我该如何使用?
我仍然可以使用它吗?
在这种情况下,我不推荐使用 CNN。
您是否将 CNN 用于学生数据集?它对您有效吗?
先生,为什么我们在卷积步骤中使用激活函数?您能告诉我它的意义吗?
您确切的意思是什么?你能举个例子吗?
您的教程消除了我所有的疑虑。非常感谢。
很高兴听到这个消息。
你好 Jason Brownlee,你能推荐一些容易理解的研究论文来练习卷积神经网络吗?
您可以在 scholar.google.com 上搜索论文。
尊敬的先生,
在此部分下
关于卷积神经网络的进阶阅读\
斯坦福 CS231n 课程中的卷积网络模型
https://cs231n.github.io/convolutional-networks/%20https://cs231n.github.io/
此链接显示“页面未找到”。请您审阅和修复。
谢谢,已修正。
非常感谢您又一篇精彩的教程。
为什么您建议在 CNN 模型深入时增加过滤器的数量?我的第一直觉是,需要减少过滤器的数量,以便网络能够捕捉到更大的画面,而不是细节。
好问题,这是模型配置的一种模式,一再被证明具有更好的性能。
例如,我们深入越多,就有越多机会以不同的方式解释提取的特征。
本教程中的参考文献也可能有所帮助
https://machinelearning.org.cn/introduction-to-the-imagenet-large-scale-visual-recognition-challenge-ilsvrc/
非常感谢 Jason,您是传奇人物。
所以答案是
(a)实验证明,过滤数量递增的架构显示出更好的结果。
(b)我们可以通过解释的数量来解释观察结果——我们越深入,可能性就越多,因为计算机可以捕捉到的模式越来越复杂,因为它从看到点和线等非常简单的特征转向看到眼睛和面孔等复杂结构。
是的,总结得很好。
你好:CNN 是最好的文本分类器吗?如果不是,什么算法最好?
是的,请看这个
https://machinelearning.org.cn/best-practices-document-classification-deep-learning/
我目前正在进行一项硕士论文研究,主题是识别社交网络上宣扬仇恨的言论。您对此主题有什么具体想法可以工作(识别一个具体问题以进行工作)……预先非常感谢您
这个框架可能有助于您定义问题。
https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/
你好 Jason。感谢您出色的工作!我的问题与卷积滤波器有关。我理解在图像处理中使用 2D 卷积的传统方法,其中每个核(带滤镜图)都预先设计用于“做”某事。例如,1/9 * [1 1 1; 1 1 1; 1 1 1] 是一个 3x3 核,用作模糊过滤器,等等。我不理解的是,在学习过程中如何创建滤镜图。您介意分享一些相关信息吗?或者一些有用的链接?谢谢,此致敬礼!Jan
是的,请看这个
https://machinelearning.org.cn/convolutional-layers-for-deep-learning-neural-networks/
谢谢!这正是我想要的!
很高兴听到这个消息。
你好,
如果我有
– 输入为 x20x20x1
– Conv2D,filters = 16,kernel_size = 3,activation=’relu’,padding=’same’
– MaxPooling2D(pool_size = (2, 2),padding=’same’)
我的输出将是 x10x10x16,因为有 16 个过滤器
然后我再添加一层
– Conv2D,filters = 8,kernel_size = 3,activation=’relu’,padding=’same’
– MaxPooling2D(pool_size = (2, 2),padding=’same’)
我的输出将是 x5x5x8,因为有 8 个过滤器
这两层之间发生了什么?x16 去了哪里?
我的理解是形状的最后一个数字,x16 然后 x8 是关于图层数量的信息,但图层是一个更复杂的对象。
x16 实际上是 x16 x1(第四维)。x8 是 x8x16x1(对前 16 个过滤器应用 8 个过滤器)。
这是正确的吗?还是我完全错了?
输入 (20,20,1) 应用一个 Conv2D,kernel size 3,stride 1,same padding 将是 (20,20,1);所以如果你应用 16 个 Conv2D,输出将是 (20,20,16)。然后应用 MaxPooling,pool size (2,2),它将变成 (10,10,16)。我们称之为 16 是通道数。
所以我的问题是,在第一个 MaxPooling2D 的输出 (10,10,16) 和第二个 Conv2D,filters = 8 之间,通道数 (16) 如何变成 8?
或者什么是通道?
每个卷积核分别应用于 16 个通道,然后将它们相加得到一个通道。
此处有图片(也请关注第一个答案中的 YouTube 链接): https://datascience.stackexchange.com/questions/85366/math-behind-2d-convolution-for-rgb-images
你好 Jason,我在这里迷失了
“以步长为 1 的 5x5 感受野跨越输入图像数据将生成一个 28x28 的特征图输出值,或者每张图像有 784 个不同的激活。”
数字“28”是从哪里来的?您是简单地计算:(字段尺寸)^2 + 步长*尺寸 = 5^2 + 1*3 = 28 吗?
这里的公式是什么?
你好 yerma…以下资源可能对您有所帮助
https://towardsdatascience.com/deciding-optimal-filter-size-for-cnns-d6f7b56f9363
https://towardsdatascience.com/applied-deep-learning-part-4-convolutional-neural-networks-584bc134c1e2
CNN 可以处理 3D 几何数据吗?还是有其他适合 3D 分类的 NN 结构?您是否有关于此主题的博客,或者您是否知道是否有人在做这方面的工作?
你好 Mujtaba…虽然我们没有专门针对该主题的内容,但以下资源可能提供一些思路
https://www.frontiersin.org/articles/10.3389/fninf.2018.00042/full
我使用 conv1d 作为简单/快速注意力层的变体
y = Input(x) -> Dense(x)
Input(x) -> Conv(x,x) -> Add(y) -> result
试试看 🙂
感谢您的推荐 Alex!我们感谢您的贡献!