神经网络初始——利用keras搭建网络架构

179 阅读5分钟

keras和tensorflow之间的关系

需要先安装好tensorflow,再安装keras,才能使用keras

tensorflow简介

tensorflow是Google开源的基于数据流图的机器学习框架,支持python和c++程序开发语言。轰动一时的AlphaGo就是使用tensorflow进行训练的,其命名基于工作原理,tensor意为张量(即多维数组),flow 意为流动。即多维数组从数据流图一端流动到另一端。目前该框架支持 Windows、Linux、Mac乃至移动手机端等多种平台。

Keras简介

Keras是基于TensorFlow和Theano(由加拿大蒙特利尔大学开发的机器学习框架)的深度学习库,是由纯python编写而成的高层神经网络API,也仅支持python开发。它是为了支持快速实践而对tensorflow或者Theano的再次封装,让我们可以不用关注过多的底层细节,能够把想法快速转换为结果。它也很灵活,且比较容易学。Keras默认的后端为tensorflow,如果想要使用theano可以自行更改。tensorflow和theano都可以使用GPU进行硬件加速,往往可以比CPU运算快很多倍。因此如果你的显卡支持cuda的话,建议尽可能利用cuda加速模型训练。(当机器上有可用的GPU时,代码会自动调用GPU 进行并行计算。)


目前Keras已经被TensorFlow收录,添加到TensorFlow 中,成为其默认的框架,成为TensorFlow官方的高级API。

image.png

初探神经网络

此笔记本包含《使用 Python 进行深度学习》第 2 章第 1 节中的代码示例。请注意,原始文本包含更多内容,特别是进一步的解释和图表:在此笔记本中,您只会找到源代码和相关注释。


现在,我们将看一下神经网络的第一个具体示例,它利用 Python 库 Keras 来学习对手写数字进行分类。

我们在这里尝试解决的问题是将手写数字的灰度图像(28 像素 x 28 像素)分为 10 个类别(0 到 9)。我们将使用的数据集是 MNIST 数据集,这是机器学习社区中的经典数据集,它几乎与该领域本身一样长,并且已经被进行了非常深入的研究。这是一组 60,000 个训练图像,外加 10,000 个测试图像,由美国国家标准与技术研究院(MNIST 中的 NIST)在 1980 年代组装而成。您可以将“解决”MNIST 视为深度学习的“Hello World”——这是您为验证算法是否按预期工作所做的工作。当您成为机器学习从业者时,您会看到 MNIST 一遍又一遍地出现在科学论文、博客文章等中。


MNIST 数据集以一组四个 Numpy 数组的形式预加载在 Keras 中:

from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images 和 train_labels 构成 “训练集”,即模型将从中学习的数据。然后,模型将在 “测试集” 上进行测试,test_images 和 test_labels。我们的图像被编码为 Numpy 数组,标签只是一个数字数组,范围从 0 到 9。图像和标签之间存在一一对应的关系。

from keras import models
from keras import layers

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

神经网络的核心构建块是“层”,这是一个数据处理模块,您可以将其视为数据的“过滤器”。一些数据进来,以更有用的形式出来。准确地说,层从输入到它们的数据中提取表示 —— 希望这些表示对手头的问题更有意义。大多数深度学习实际上包括将简单的层链接在一起,这些层将实现一种渐进式的“数据蒸馏”形式。深度学习模型就像一个用于数据处理的筛子,由一系列日益精细的数据过滤器(即“层”)组成。


在这里,我们的网络由两个 Dense 层的序列组成,它们是密集连接(也称为“全连接”)神经层。第二个(也是最后一个)层是一个 10 路的 “softmax” 层,这意味着它将返回一个包含 10 个概率分数的数组(总和 1)。每个分数将是当前数字图像属于我们的 10 位数字类别之一的概率。


为了让我们的网络为训练做好准备,我们需要再选择三件事,作为 “编译” 步骤的一部分:

  • 损失函数:即网络如何能够衡量它在训练数据上做得有多好,从而如何能够将自己引导到正确的方向。
  • 优化器:这是网络根据它看到的数据及其损失函数进行自我更新的机制。
  • 在训练和测试期间要监控的指标。在这里,我们只关心准确性(正确分类的图像的比例)。

我们现在已准备好训练我们的网络,在 Keras 中,这是通过调用网络的 fit 方法完成的:我们将模型“拟合”到其训练数据。

network.fit(train_images, train_labels, epochs=5, batch_size=128)

在训练过程中会显示两个量:网络在训练数据上的“损失”,以及网络在训练数据上的准确性。

我们很快就在训练数据上达到了 0.989 (即 98.9%) 的准确率。现在让我们检查一下我们的模型在测试集上是否也表现良好:

test_loss, test_acc = network.evaluate(test_images, test_labels)