翻译:陈丹
校对:和中华
本文为大家介绍了如何使用Keras来快速实现一个神经网络。
回忆起我第一次接触人工智能的时候,我清楚地记得有些概念看起来是多么令人畏惧。阅读一个关于神经网络是什么的简单解释时,很容易阅读到的是一篇科学论文,其中每一句话都是一个包含很多你从未见过的符号的公式。虽然这些论文有着令人难以置信的洞察力和深度可以帮助你建立你的专业知识,但是开始写你的第一个神经网络其实比那些听起来容易得多!
那到底什么是神经网络呢?
好问题!在我们开始用Python编写实现一个简单的神经网络(简称为NN)之前,我们或许应该先明白它们是什么,以及为什么它们如此令人兴奋!
HNC软件公司的联合创始人罗伯特·赫克特尼尔森博士把它解释得很简单。
一个由许多简单、高度互连的处理元素组成的计算系统,这些元素通过对外部输入的动态响应来处理信息。——“神经网络入门:第一部分”,Maureen Caudill,人工智能专家,1989年2月。
从本质上讲,神经网络是一组非常擅长识别信息或数据模式的数学表达式。神经网络通过一种模拟人类感知的方法来实现这一点,但是神经网络并不像人类那样“看到”或“描述”图像,而是用包含数字的向量或标量(仅包含一个数字的向量)来表示这些信息。
它通过多个将上一层的输出作为下一层的输入的层来传递这些信息。当通过这些层时,输入的信息将被权重和偏差修改,并被发送到激活函数以映射输出。然后,学习通过一个成本函数进行,该函数比较实际输出和期望输出,进而帮助该函数通过一个称为反向传播的过程来改变和调整权重和偏差,以最小化成本。
我们的NN实现示例将使用MNIST数据集。
MNIST样本数据集
MNIST可以被视为“hello world”数据集,因为它能够非常简洁地演示神经网络的功能。数据集由手写数字组成,我们将训练神经网络来对它们进行识别和分类。
进入drago…我是说Keras。
为了便于实施,我们将使用Keras框架。Keras是一个用Python编写的高级API,它运行在诸如TensorFlow、Theano等流行框架之上,为机器学习实践者提供了一个抽象层,以减少编写NNS的固有复杂性。
我鼓励你们深入研究Keras文档,以便真正熟悉API。此外,我强烈推荐francois chollet的《python深度学习》一书,它激发了本教程的灵感。
是时候烧点GPU了
在本教程中,我们将把tensorflow作为后端来使用keras,因此如果您还没有安装其中任何一个,现在是这样做的好时机。您只需在终端中运行这些命令就可以实现这一点。
当您超出简单的介绍性示例时,最好设置您的Anaconda环境并用conda安装下面的内容。
既然您已经安装了位于您和第一个NN之间需要的所有组件,那么接下来就打开您最喜欢的IDE,让我们开始导入所需的Python模块!
Keras有很多数据集可以用来帮助你学习,幸运的是我们的MNIST就是其中之一!模型和层都是将帮助我们建立我们的神经网络的模块,to_categorical用于我们的数据编码…稍后再详细介绍!
现在我们已经导入了所需的模块,我们想要将数据集拆分为训练集和测试集。这可以通过以下几行简单地完成。
在这个例子中,我们的神经网络通过比较它的输出和标记的数据来学习。你可以理解为我们让神经网络猜测大量的手写数字,然后将猜测结果与实际标签进行比较,然后将比较结果反馈到模型,调整权重和偏差,以最小化总体成本。
建立好测试集和训练集后,现在就可以构建我们的模型了。
代码语言:javascript复制network = models.Sequential() network.add(layers.Dense(784, activation='relu', input_shape=(28 * 28,))) network.add(layers.Dense(784, activation='relu',))
个人理解这里是作者失误了,通常只有第一层才需要明确input_shape, 后续层都是Keras自动计算数据形状的。
代码语言:javascript复制network.add(layers.Dense(10, activation='softmax'))network.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
我知道…我知道…看起来好像很多,但让我们一起分解它!我们初始化一个称为网络的序列模型。
我们加上神经网络层。在本例中,我们将使用dense层(即全连接神经网络层)。一个dense层仅仅意味着每个神经元接收来自前一层所有神经元的输入。[784]和[10]指的是输出空间的维数,我们可以把它看作是后续层的输入数量,由于我们试图解决一个有10个可能类别(数字0到9)的分类问题,最后一层有10个单位的潜在输出。激活参数是指我们想要使用的激活函数,实际上,激活函数将根据给定的输入计算输出。最后,[28*28]的输入形状是指图像的像素宽度和高度。
一旦我们定义好了模型,并且添加了我们的NN层,我们只需使用我们选择的优化器、我们选择的损失函数和我们想要用来判断模型性能的度量来编译模型。
祝贺!你已经构建了你的第一个神经网络!
现在你可能还有一些问题,比如:什么是relu和softmax?到底什么是Adam?这些都是很好的问题……对这些问题的深入解释稍微超出了我们NN的入门范围,但我们将在后面的文章中讨论这些问题。
在我们将数据输入到新创建的模型之前,我们需要将输入重塑为模型可以读取的格式。我们输入的原始形状是[60000,28,28],它基本上表示60000个像素高和宽为28 x 28的图像。我们可以重塑我们的数据,并将其分为[60000]个训练图像和[10000]个测试图像。
除了重塑我们的数据,我们还需要对其进行编码。在本例中,我们将使用分类编码,这在本质上转换了数字表示中的许多特征。
当我们的数据集被分割成训练和测试集,我们的模型被编译,我们的数据被重塑和编码后,我们现在可以准备训练我们的神经网络了!为此,我们将调用fit函数并传入所需的参数。
我们传入训练图像、标签以及遍历次数(反向和正向传播数量)和批大小(每次反向/正向传播的训练样本数量)。
我们还需要设置性能度量参数,以便评估模型的工作情况。
瞧!你刚刚构建了你自己的神经网络,重塑和编码了一个数据集,并且训练了你的模型!当您第一次运行python脚本时,keras将下载mnist数据集并将遍历训练5次!
你的测试准确率应该在98%左右,这意味着模型在运行测试时预测正确了98%的数字,对你的第一个nn来说还不错!在实践中,您需要查看测试和训练结果,以了解您的模型是否过拟合/欠拟合。
我鼓励您调整层数、优化器和损失函数,以及遍历次数和批大小,看看它们对您的模型的总体性能有什么影响!
在漫长而激动人心的学习之旅中,你刚刚迈出了艰难的第一步!请随时联系任何其他澄清或反馈!
谢谢你的阅读,保持好奇心!
原文标题:
Writing Your First Neural Net in Less Than 30 Lines of Code with Keras
原文链接:
https://www.kdnuggets.com/2019/10/writing-first-neural-net-less-30-lines-code-keras.html