子像素卷积keras_初学者的 Keras:实现卷积神经网络

Keras是一个简单易用但功能强大的 Python 深度学习库。在这篇文章中,我们将用 Keras 构建一个简单的卷积神经网络(CNN),并训练它来解实际问题。

这篇文章适用于完全初学 Keras 的人,但假设有 CNNs 的基本背景知识。我对卷积神经网络的介绍涵盖了你在这篇文章中需要知道的一切(以及更多内容),如果需要,请先阅读。

我们现在就开始!想要代码吗?完整的源代码在末尾。

问题:MNIST数字分类

我们将处理一个经典的计算机视觉入门问题:MNIST 手写数字分类。很简单:给定一个图像,将其分类为一个数字。Python学习教程点击【资料】领取!

MNIST 数据集中的样本图像

MNIST 数据集中的每个图像都是 28x28,包含一个居中的灰度数字。我们的 CNN 将获取一个图像并输出 10 个可能的类中的一个(每个数字一个)。

1. 安装

我假设你已经有了一个基本的 Python 安装(可能是这样)。让我们先下载一些我们需要的包:

注意:我们需要安装 tensorflow ,因为我们要在 TensorFlow 后端上运行 Keras(即 TensorFlow 将装备 Keras )。

现在你应该能够导入这些包并浏览 MNIST 数据集:

2. 准备数据

在开始之前,我们将把图像像素值从 [0,255] 规范化为 [-0.5,0.5] 以使网络更容易训练(使用较小的中心值通常会得到更好的结果)。我们还将把每个图像从(28,28)改为(28,28,1),因为 Keras 需要第三维度。

我们准备好开始构建我们的 CNN 了!

3. 构建模型

每个 Keras 模型要么使用表示层的线性堆栈的 Sequential 类构建,要么使用更可定制的功能 Model 类。我们将使用更简单的Sequential 模型,因为我们的 CNN 将是一个层的线性堆栈。

我们首先实例化一个 Sequential 模型:

Sequential 构造函数接受一个 Keras Layers 数组。我们将为 CNN 使用三种类型的层:卷积层、最大池层和 Softmax 层。

这是我们在我的 CNN 简介中使用的 CNN 设置。如果你对这三种层的任何一种都不满意的话,请阅读这篇文章。

num_filters, filter_size 和 pool_size 是设置 CNN 超参数的自解释变量。

任何 Sequential 模型中的第一层都必须指定输入 input_shape,因此我们在 Conv2D上执行此操作。一旦指定了此输入形状,Keras 将自动推断后续层的输入形状。

Softmax 输出层有 10 个节点,每个类一个。

4. 编译模型

在开始培训之前,我们需要配置训练过程。我们在编译过程中确定了3个关键因素:优化器。我们将坚持用一个非常好的默认设置:Adam 基于梯度的优化器。Keras 还有许多其他优化器,你也可以查看。

损失函数。因为我们使用的是 SoftMax 输出层,所以我们将使用交叉熵损失。Keras 区分 binary_crossentropy (2类)和 categorical_crossentropy(>2 类),因此我们将使用后者。查看所有的 Keras 损失函数.

度量列表。因为这是一个分类问题,所以我们只会有关于准确度度量的 Keras 报告。

下面是编译的样子:

走起!

5. 训练模型

在 Keras 中训练模型实际上只包括调用 fit() 和指定一些参数。有很多可能的参数,但我们只提供这些:训练数据(图像和标签),通常分别称为 X 和 Y。

训练的 epoch 数(整个数据集的迭代次数)。

验证数据(或测试数据),在训练期间用于根据以前从未见过的数据定期测量网络性能。

有一件事我们必须小心:Keras 期望训练目标是 10 维向量,因为我们的 Softmax 输出层中有 10 个节点。现在,我们的 train_labels 和 test_labels 数组包含表示每个图像的类的单个整数:

很方便,Keras 有一个实用的方法来解决这个确切的问题:to_categorical。它将整数类数组转换为一个独热向量数组。例如,2 将变为[0, 0, 1, 0, 0, 0, 0, 0, 0, 0](它是从零索引)。

这就是它的样子:

我们现在可以把所有的东西放在一起训练我们的网络:

在完整 MNIST 数据集上运行该代码可以得到如下结果:

我们用这个简单的 CNN 达到了 97.4% 的测试精度!

6. 使用模型

既然我们有了一个有效的、经过训练的模型,让我们来使用它。我们要做的第一件事是将它保存到磁盘上,这样我们就可以随时加载它:

通过重建模型并加载保存的权重,我们现在可以在任何需要的时候重新加载经过训练的模型:

使用经过训练的模型进行预测很容易:我们将输入数组传递给 predict(),它返回一个输出数组。请记住,我们网络的输出是 10 个概率(因为 softmax),所以我们将使用 np.argmax() 将这些转换为实际数字。

8. 扩展

我们还可以做更多的实验并改进我们的网络 - 在这个官方的 Keras MNIST CNN 例子中,他们在 12 个 epochs 后达到了99.25% 的测试精度。你可以对我们的 CNN 进行修改的一些例子包括:

网络深度

如果我们添加或删除 Convolutional 层会发生什么?这将如何影响训练和/或模型的最终性能?

Dropout

如果我们尝试添加通常用来防止过拟合的 Dropout 层会发生什么?

全连接层

如果我们在 Convolutional 输出和最终的 Softmax 层之间添加全连接层会发生什么?这是 CNNs 中用于计算机视觉的常见操作。

卷积参数

如果我们使用 Conv2D 参数会发生什么?例如:

结语

你已经用 Keras 实现了你的第一个 CNN!我们通过首个简单网络获得了 97.4% 的测试精度。我在下面再加一次完整的源代码供你参考。

你可能感兴趣的扩展阅读包括:官方的 Keras 入门指南。

我关于导出训练 CNNs 的反向传播算法的文章。

Keras 示例集锦.

更多关于神经网络的文章.

谢谢你的阅读!完整的源代码如下。需要Python教程的点击【资料】领取!

完整代码

你可能感兴趣的:(子像素卷积keras)