搭建卷积神经网络怎么确定参数_初学者的 Keras:实现卷积神经网络

本文是针对初学者的Keras深度学习库使用指南,讲解如何使用Keras构建卷积神经网络(CNN)解决MNIST手写数字分类问题。介绍了安装、数据准备、模型构建、编译、训练和评估的步骤,最终实现97.4%的测试精度。
摘要由CSDN通过智能技术生成

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

8

关于在 Python 中使用 Keras 实现简单卷积神经网络(CNN)的初学者友好指南。

2019年8月8日

keras-logo.png

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

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

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

问题:MNIST数字分类

我们将处理一个经典的计算机视觉入门问题:MNIST 手写数字分类。很简单:给定一个图像,将其分类为一个数字。

mnist-examples.png

MNIST 数据集中的样本图像

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

1. 安装

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

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

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

898ecc855e6d0c42f0e3baef7ad9de7c.png

2. 准备数据

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

c4570b35f1c30d4b4f91bbb7cdd93ea1.png

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

3. 构建模型

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

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

c61d912d866bf9b7084570c5b22e4f23.png

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

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

396fcca3db3262d146a6e1bf34a325f1.pngnum_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 报告。

下面是编译的样子:

0335cee45997284f9f618275292c466e.png

走起!

5. 训练模型

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

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

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

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

e5d66b5aa177b0d174ff6fc570f813d9.png

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

这就是它的样子:

8879eebbe2d21454246115ab777fa345.png

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

ebdb226004564dcd5ca6df3bd185f7fa.png

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

41fcb3f503571b09cd257ef73d525330.png

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

6. 使用模型

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

cd633dcac995630f5900291f69b26c2c.png

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

a2aa67f14b62496b33119e56d782fa53.png

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

23ee4a5775fef0730224a3f95cc67e7b.png

8. 扩展

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

网络深度

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

9598e62691ca80f936aa64890c1f7088.png

Dropout

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

b34e9c892e40e4fc3b68e3c13a7e177b.png

全连接层

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

1d132d3c6c7e361a8bc293edc29c7d8d.png

卷积参数

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

67a5831e05492156d6bc799f4ba4a7a0.png

结语

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

你可能感兴趣的扩展阅读包括:

谢谢你的阅读!完整的源代码如下。

完整代码

d4cdf9b907a434befa9ad67472f6386c.png

英文原文:https://victorzhou.com/blog/keras-cnn-tutorial/

译者:青书

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值