登 录
注 册
< 人工智能
深度学习
机器学习
大模型
深度学习介绍
现状和未来
数学基础
通用工作流程
Keras简介
过拟合与欠拟合
卷积神经网络
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
深度学习
>>
卷积神经网络
卷积神经网络
2020-07-04 17:42:48 星期六 阅读:3896
![](/static/images/article_images/1693111843.812632.png) 卷积神经网络也叫做convnet,它是计算机视觉应用几乎都在使用的一种深度学习模型。你将学到卷积神经网络有应用于图像分类问题,特别是那些训练数据集较小的问题。 我们将深入讲解卷积神经网络的原理,以及它在计算机视觉任务上为什么如此成功。但在此之前,我们先来看一个简单的卷积神经网络示例,即使用卷积神经网络对 MNIST 数字进行分类 下列代码将会展示一个简单的卷积神经网络。它是Conv2D层和MaxPooling2D层的堆叠。 很快你就会知道这些层的作用。我们在mnist数字图像上训练这个卷积神经网络。 ``` from keras import models from keras.datasets import mnist from keras import layers from keras.utils import to_categorical # 加载数据 (train_data, train_labels), (test_data, test_labels) = mnist.load_data() # 数据规范化 train_data = train_data.reshape((60000, 28, 28, 1)) train_data = train_data.astype("float32") / 255 test_data = test_data.reshape((10000, 28, 28, 1)) test_data = test_data.astype("float32") / 255 # 将分类标签向量化,也叫分类编码 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) # 构建模型 model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation="relu", input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation="relu")) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation="relu")) model.add(layers.Flatten()) model.add(layers.Dense(64, activation="relu")) model.add(layers.Dense(10, activation="softmax")) # 编译并训练模型 model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=["accuracy"]) model.fit(train_data, train_labels, epochs=5, batch_size=64) # 模型评估 test_loss, test_acc = model.evaluate(test_data, test_labels) print("test_loss:", test_loss) print("test_acc:", test_acc) ``` 重要的是,卷积神经网络接收形状为 (image_height, image_width, image_channels) 的输入张量(不包括批量维度)。本例中设置卷积神经网络处理大小为 (28, 28, 1) 的输入张量, 这正是 MNIST 图像的格式。我们向第一层传入参数 input_shape=(28, 28, 1) 来完成此设置。 第 2 章密集连接网络的测试精度为 97.8%,但这个简单卷积神经网络的测试精度达到了 98.8%,我们将错误率降低了。 与密集连接模型相比,为什么这个简单卷积神经网络的效果这么好?要回答这个问题,我们来深入了解 Conv2D 层和 MaxPooling2D 层的作用。 ####卷积运算 密集连接层和卷积层的根本区别在于,Dense 层从输入特征空间中学到的是全局模式(比如对于mnist数据集,全局模式就是涉及所有像素的模式),而卷积层学到的是局部模式,对于图像来说,学到的就是在输入图像的二维小窗口中发现的模式。在上面的例子中,这些窗口的大小都是3*3。 这个重要特性使卷积神经网络具有以下两个有趣的性质: - `卷积神经网络学到的模式具有平移不变性(translation invariant)`。卷积神经网络在图像右下角学到某个模式之后,它可以在任何地方识别这个模式,比如左上角。对于密集连接网络来说,如果模式出现在新的位置,它只能重新学习这个模式。这使得卷积神经网 络在处理图像时可以高效利用数据(因为视觉世界从根本上具有平移不变性),它只需 要更少的训练样本就可以学到具有泛化能力的数据表示。 - `卷积神经网络可以学到模式的空间层次结构(spatial hierarchies of patterns)`。第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推。这使得卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(因为视觉世界从根本上具有空间层次结构)。 在 MNIST 示例中,第一个卷积层接收一个大小为 (28, 28, 1) 的特征图,并输出一个大 小为 (26, 26, 32) 的特征图,即它在输入上计算 32 个过滤器。对于这 32 个输出通道,每个 通道都包含一个 26×26 的数值网格,它是过滤器对输入的响应图(response map),表示这个过滤器模式在输入中不同位置的响应。这也是特征图这一术语的含义:深度轴的每个维度都是一个特征(或过滤器),而 2D 张量 output[:, :, n] 是这个过滤器在输入上的响应的二维空间图(map)。 卷积由以下两个关键参数所定义 - 从输入中提取的图块尺寸:这小图块的大小通常是3x3或者5x5,本例中为3x3,这是很常见的选择。 输出特征图的深度:卷积所计算的过滤器的数量。本例第一层的深度为32,最后一层的深度是64。 对于Keras的Conv2D层,这些参数都是向层传入的前几个参数 `Conv2D(output_depth, (window_height, window_width))` ####卷积的工作原理 在 3D 输入特征图上滑动(slide)这些 3×3 或 5×5 的窗口,在每个可能 的位置停止并提取周围特征的 3D 图块[形状为 (window_height, window_width, input_ depth)]。然后每个 3D 图块与学到的同一个权重矩阵[叫作`卷积核(convolution kernel)`]做张量积,转换成形状为 (output_depth,) 的 1D 向量。然后对所有这些向量进行空间重组, 使其转换为形状为 (height, width, output_depth) 的 3D 输出特征图。输出特征图中的每个空间位置都对应于输入特征图中的相同位置(比如输出的右下角包含了输入右下角的信 息)。举个例子,利用 3×3 的窗口,向量 output[i, j, :] 来自 3D 图块 input[i-1:i+1, j-1:j+1, :]。 注意,输出宽度和输出高度可能与输入的宽度和高度不同。原因可能有两点: - 边界效应,可通过对输入特征图进行填充来抵消。 使用了步幅,稍后会给出定义。 ####最大池化运算 如果不使用最大池化运算,那会有什么问题?有如下两点问题。 - `这种架构不利于学习特征的空间层级结构`。第三层的 3×3 窗口中只包含初始输入的7×7 窗口中所包含的信息。卷积神经网络学到的高级模式相对于初始输入来说仍然很小,这可能不足以学会对数字进行分类(你可以试试仅通过 7 像素×7 像素的窗口观察图像来识别其中的数字)。我们需要让最后一个卷积层的特征包含输入的整体信息。 - `最后一层的特征图对每个样本共有 22×22×64=30 976 个元素`。这太多了。如果你将其 展平并在上面添加一个大小为 512 的 Dense 层,那一层将会有 1580 万个参数。这对于这样一个小模型来说太多了,会导致严重的过拟合。 简而言之,使用下采样的原因,`一是减少需要处理的特征图的元素个数,二是通过让连续卷积层的观察窗口越来越大(即窗口覆盖原始输入的比例越来越大)`,从而引入空间过滤器的层级结构。 注意,最大池化不是实现这种下采样的唯一方法。你已经知道,还可以在前一个卷积层中使用步幅来实现。此外,你还可以使用平均池化来代替最大池化,其方法是将每个局部输入图块变换为取该图块各通道的平均值,而不是最大值。但最大池化的效果往往比这些替代方法更好。 简而言之,原因在于特征中往往编码了某种模式或概念在特征图的不同位置是否存在(因此得名特征图),而观察不同特征的最大值而不是平均值能够给出更多的信息。因此,最合理的子采样策略是首先生成密集的特征图(通过无步进的卷积),然后观察特征每个小图块上的最大激活, 而不是查看输入的稀疏窗口(通过步进卷积)或对输入图块取平均,因为后两种方法可能导致错过或淡化特征是否存在的信息。 现在你应该已经理解了卷积神经网络的基本概念,即特征图、卷积和最大池化,并且也知道如何构建一个小型卷积神经网络来解决简单问题,比如 MNIST 数字分类。