导语:在这篇 Keras 教程中, 你将学到如何用 Python 建立一个卷积神经网络!事实上, 我们将利用著名的 MNIST 数据集, 训练一个准确度超过 99% 的手写数字分类器.
开始之前, 请注意, 本指南是面向对应用深度学习感兴趣的初学者的.
我们旨在向你介绍一个最流行的同时也是功能最强大的, 用于建立神经网络的 Python 库. 这意味着我们将跳过许多理论与数学知识, 但我们还是会向你推荐一些学习这些的极好的资源.
本指南推荐的预备知识有:
机器学习的基本概念
Python 编程技能
为了能快速开始, 我们假设你已经具备了这方面的知识.
Keras 是我们推荐的 Python 深度学习库, 尤其是对于初学者而言. 它很简约, 模块化的方法使建立并运行神经网络变得轻巧. 你可以在这里读到更多关于 Keras 的内容:
Keras, Python 的深度学习库
深度学习是指具有多隐层的神经网络, 其可以学习输入数据的抽象表示. 这个定义显然太简单了, 但对于现在的我们来说, 却是最有实际意义的.
比方说, 深度学习促进了计算机视觉的巨大进步. 现在, 我们能够对图片进行分类, 识别图片中的物体, 甚至给图片打标签. 要实现这些, 多隐层的深度神经网络可以从原始输入图片中按序学习更复杂的特征:
第一层隐层也许只能学习到局部边缘模式.
之后, 每一个后续层 (或过滤器) 将学习更复杂的表示.
最后, 最后一层可以对图片进行分类, 是猫还是袋鼠.
这类深度神经网络就称为卷积神经网络.
简而言之, 卷积神经网络 (CNN) 就是将输入数据假设成图的多层神经网络 (有些时候, 会有多达 17 甚至更多层).
卷积神经网络的底层机制已经超过了本教程的范围, 更多请看这里.
这不是一门深度学习的完整课程. 相反地, 本教程旨在带你从零到一, 尽量”无痛”地建立卷积神经网络!
如果你有兴趣掌握深度学习背后的理论, 强烈推荐斯坦福大学的这门课:
CS231n: Convolutional Neural Networks for Visual Recognition
我们试着让教程尽可能流线化, 这意味着任何一个主题, 我们都不会太深究细节. 万一你想要学习关于一个函数或模块更多的知识, 同时打开 Keras 文档 很有帮助.
下面是创建你的第一个卷积神经网络 (CNN) 的步骤:
配置环境
安装 Keras
导入库和模块
从 MNIST 导入图片数据
预处理输入数据
预处理类标签
定义模型架构
编译模型
用训练数据拟合模型
用测试数据评估模型
首先, 挂一张励志海报:
然后, 确保你的计算机上已经安装了以下软件:
Python 2.7+ (Python 3 也可以, 但总体而言, Python 2.7 在数据科学领域依旧更受欢迎.)
Scipy 和 NumPy
Matplotlib (可选的, 推荐用于探索性分析)
Theano* (安装指南)
强烈建议使用 Anaconda 发行版 来安装 Python, NumPy, SciPy. 它自带所有这些包.
注意: 用 TensorFlow 也可以 (作为 Theano 的替代), 但我们将坚持使用 Theano, 以保持程序足够简单. 使用 TensorFlow 和 Theano 的主要区别在于, 数据输入神经网络之前, 需要简单地重塑.
打开命令行窗口 (Mac 上是 Terminal), 并输入:
如果我们没有涵盖如何安装 Keras, 这就不是一篇 Keras 的教程.
好消息是, 如果你使用的 Anaconda, 你已经安装好了一个超赞的包管理系统: pip.
你可以在命令行输入 $ pip
确认安装. 这条命令将打印一个命令和选项的列表. 如果你还没有安装 pip, 参照这里进行安装.
安装好 pip 之后, 安装 Keras 就很简单了:
首先, 导入 numpy 并设置伪随机数生成器设置种子. 这允许我们从脚本中重现结果:
MNIST 是深度学习和计算机视觉入门很好的数据集. 它很大, 这对于神经网络是一个巨大的挑战, 但它在单台计算机上又是可管理的. 我们将在另一个文章中对此进行更多的讨论: 6 Fun Machine Learning Projects for Beginners.
很方便的是, Keras 库已经包含了 MNIST. 可以像这样加载它:
在后端使用 Theano 时, 你必须显式地声明一个维度, 用于表示输入图片的深度. 举个例子, 一幅带有 RGB 3 个通道的全彩图片, 深度为 3.
MNIST 图片的深度为 1, 因此必须显式地进行声明.
换言之, 我们要将数据集从 (n, width, height) 转换成 (n, depth, width, height).
可以简单地实现:
接下来, 让我们看一下类标签数据的形状:
对此, 我们可以进行简单的修正:
现在, 我们就可以定义我们的模型架构了. 在实际研发工作中, 研究员会花大量的时间研究模型架构.
在这里, 为了教程的继续, 我们不会讨论理论或数学. 这本身就是复杂的领域, 对于想要深入学习的同学, 建议看一下上文提到的 CS231n 课程.
另外, 刚开始时, 你可以使用现成的例子或者实现紫黯学术论文中已经证明的架构. 这里有一个 Keras 实现样例.
我们先声明一个顺序模型:
但是前 3 个参数又代表什么呢? 它们分别对应于要使用的卷积过滤器的数量, 每个卷积内核的行数与列数.
注意: 默认情况下, 步长为 (1, 1), 可以用 ‘subsample’ 参数进行调整.
打印当前模型的输出进行确认:
MaxPooling2D 是一种减少模型参数数量的方式, 其通过在前一层上滑动一个 2*2 的滤波器, 再从这个 2*2 的滤波器的 4 个值中取最大值.
到目前为止, 对于模型的参数, 我们已经添加了 2 个卷积层. 要完成模型的架构, 让我们添加一个完全连接的层和输出层:
注意到最后一层的输出大小为 10, 对应于 10 个数字类型.
同时还要注意, 卷积层的权重在传递给完全连接的 Dense 层之前, 必须压平 (维度为 1).
以下是完整的模型架构:
现在可以轻松一点了, 最难的部分已经过去了.
只需要编译模型, 然后我们就可以训练它了. 编译模型时, 我们需要声明损失函数和优化器 (SGD, Adam 等等).
要拟合模型, 我们需要做的就是声明训练的批次大小以及训练次数, 然后传入训练数据.
你也可以使用各种回调函数来设置提前结束的规则, 保存模型权重, 或记录每次训练的历史.
最后, 可以用测试数据对模型进行评估:
我们刚刚体验了 Keras 的核心功能, 但也仅仅是体验. 希望通过本教程, 你已经获得了进一步探索 Keras 所有功能的基础.
如果希望继续学习, 我们推荐学习其他的 Keras 样例模型 和斯坦福大学的计算机视觉课程.
以下就是本教程的所有代码, 保存为一个脚本:
1024深度学习是由东北大学学生组织的公益学习平台,研究方向为机器学习和数据挖掘,定期组织视频学习,沙龙讲座,学术资料分享。
希望大家更多的参与到相互学习相互交流的过程中,扫描二维码进群一起学习 。
联系客服