Keras 简明教程

Keras - Quick Guide

Overview of Keras

Keras 运行于 Tensorflow、Theano 或 Cognitive Tookit (CNTK) 等开源机器库之上。Theano 是一个用于快速数值计算任务的 python 库。TensorFlow 是用于创建神经网络和深度学习模型的最著名的符号数学库。TensorFlow 非常灵活,最主要的优点是分布式计算。CNTK 是 Microsoft 开发的深度学习框架。它使用 Python、C#、C++ 等库或独立的机器学习工具包。Theano 和 TensorFlow 是非常强大的库,但对于创建神经网络来说很难理解。

Keras 基于极小的结构,提供了一种干净且简单的方式来创建基于 TensorFlow 或 Theano 的深度学习模型。Keras 旨在快速定义深度学习模型。好吧,Keras 是深度学习应用程序的最佳选择。

Features

Keras 采用各种优化技术,使高级神经网络 API 变得更加简单、高效。它支持以下功能:

  1. * 一致、简单且可扩展的 API。

  2. * 极小结构——不使用任何花里胡哨的东西即可轻松实现结果。

  3. * 它支持多个平台和后端。

  4. * 它是一个用户友好的框架,可在 CPU 和 GPU 上同时运行。

  5. Highly scalability of computation.

Benefits

Keras 是一个非常强大且动态的框架,具有以下优点:

  1. Larger community support.

  2. Easy to test.

  3. * Keras 神经网络是用 Python 编写的,这使得事情变得更简单。

  4. * Keras 同时支持卷积网络和递归网络。

  5. * 深度学习模型是离散组件,以便您可以以多种方式进行组合。

Keras - Installation

本章介绍了如何在机器上安装 Keras。在进入安装之前,让我们了解 Keras 的基本要求。

Prerequisites

您必须满足以下要求 −

  1. 任何操作系统(Windows、Linux 或 Mac)

  2. Python 3.5 或更高版本。

Python

Keras 是基于 Python 的神经网络库,因此必须在您的机器上安装 Python。如果已在您的机器上正确安装了 Python,请打开终端并输入 python,您会看到类似于下面指定的响应,

Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18)
[MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

截至目前,最新版本是“3.7.2”。如果未安装 Python,请访问官方 Python 链接 - www.python.org 根据您的操作系统下载最新版本并立即在您的系统上安装。

Keras Installation Steps

Keras 安装非常容易。按照以下步骤,可以正确安装系统中的 Keras。

Step 1: Create virtual environment

Virtualenv 用于管理不同项目的 Python 包。这有助于避免破坏在其他环境中安装的包。因此,在开发 Python 应用程序时,始终建议使用虚拟环境。

Linux/Mac OS

对于 Linux 或 mac OS 用户,转到项目根目录,然后键入以下命令以创建虚拟环境,

python3 -m venv kerasenv

执行上述命令后,将在安装位置中使用 bin,lib and include folders 创建“kerasenv”目录。

Windows

Windows 用户可以使用以下命令,

py -m venv keras

Step 2: Activate the environment

此步骤将在 shell 路径中配置 python 和 pip 可执行文件。

Linux/Mac OS

现在,我们已经创建了一个名为“kerasvenv”的虚拟环境。进入该文件夹,然后键入以下命令,

$ cd kerasvenv kerasvenv $ source bin/activate

Windows

Windows 用户进入“kerasenv”文件夹并键入以下命令,

.\env\Scripts\activate

Step 3: Python libraries

Keras 依赖于以下 python 库。

  1. Numpy

  2. Pandas

  3. Scikit-learn

  4. Matplotlib

  5. Scipy

  6. Seaborn

希望您已在系统中安装了以上所有库。如果未安装这些库,请使用以下命令逐个安装。

numpy

pip install numpy

您可能会看到以下响应,

Collecting numpy
   Downloading
https://files.pythonhosted.org/packages/cf/a4/d5387a74204542a60ad1baa84cd2d3353c330e59be8cf2d47c0b11d3cde8/
   numpy-3.1.1-cp36-cp36m-macosx_10_6_intel.
macosx_10_9_intel.macosx_10_9_x86_64.
   macosx_10_10_intel.macosx_10_10_x86_64.whl (14.4MB)
      |████████████████████████████████| 14.4MB 2.8MB/s

pandas

pip install pandas

我们可以看到以下响应,

Collecting pandas
   Downloading
https://files.pythonhosted.org/packages/cf/a4/d5387a74204542a60ad1baa84cd2d3353c330e59be8cf2d47c0b11d3cde8/
pandas-3.1.1-cp36-cp36m-macosx_10_6_intel.
macosx_10_9_intel.macosx_10_9_x86_64.
   macosx_10_10_intel.macosx_10_10_x86_64.whl (14.4MB)
      |████████████████████████████████| 14.4MB 2.8MB/s

matplotlib

pip install matplotlib

我们可以看到以下响应,

Collecting matplotlib
   Downloading
https://files.pythonhosted.org/packages/cf/a4/d5387a74204542a60ad1baa84cd2d3353c330e59be8cf2d47c0b11d3cde8/
matplotlib-3.1.1-cp36-cp36m-macosx_10_6_intel.
macosx_10_9_intel.macosx_10_9_x86_64.
   macosx_10_10_intel.macosx_10_10_x86_64.whl (14.4MB)
      |████████████████████████████████| 14.4MB 2.8MB/s

scipy

pip install scipy

我们可以看到以下响应,

Collecting scipy
   Downloading
https://files.pythonhosted.org/packages/cf/a4/d5387a74204542a60ad1baa84cd2d3353c330e59be8cf2d47c0b11d3cde8
/scipy-3.1.1-cp36-cp36m-macosx_10_6_intel.
macosx_10_9_intel.macosx_10_9_x86_64.
   macosx_10_10_intel.macosx_10_10_x86_64.whl (14.4MB)
      |████████████████████████████████| 14.4MB 2.8MB/s

scikit-learn

它是一个开源机器学习库。它用于分类、回归和聚类算法。在进行安装之前,它需要以下内容 -

  1. Python 版本 3.5 或更高

  2. NumPy 版本 1.11.0 或更高

  3. SciPy 版本 0.17.0 或更高

  4. joblib 0.11 or higher.

现在,我们使用以下命令安装 scikit-learn -

pip install -U scikit-learn

Seaborn

Seaborn 是一个神奇的库,它允许你轻松地可视化你的数据。使用以下命令进行安装 -

pip install seaborn

你可能会看到如下所示的类似信息 -

Collecting seaborn
   Downloading
https://files.pythonhosted.org/packages/a8/76/220ba4420459d9c4c9c9587c6ce607bf56c25b3d3d2de62056efe482dadc
/seaborn-0.9.0-py3-none-any.whl (208kB) 100%
   |████████████████████████████████| 215kB 4.0MB/s
Requirement already satisfied: numpy> = 1.9.3 in
./lib/python3.7/site-packages (from seaborn) (1.17.0)
Collecting pandas> = 0.15.2 (from seaborn)
   Downloading
https://files.pythonhosted.org/packages/39/b7/441375a152f3f9929ff8bc2915218ff1a063a59d7137ae0546db616749f9/
pandas-0.25.0-cp37-cp37m-macosx_10_9_x86_64.
macosx_10_10_x86_64.whl (10.1MB) 100%
   |████████████████████████████████| 10.1MB 1.8MB/s
Requirement already satisfied: scipy>=0.14.0 in
./lib/python3.7/site-packages (from seaborn) (1.3.0)
Collecting matplotlib> = 1.4.3 (from seaborn)
   Downloading
https://files.pythonhosted.org/packages/c3/8b/af9e0984f
5c0df06d3fab0bf396eb09cbf05f8452de4e9502b182f59c33b/
matplotlib-3.1.1-cp37-cp37m-macosx_10_6_intel.
macosx_10_9_intel.macosx_10_9_x86_64
.macosx_10_10_intel.macosx_10_10_x86_64.whl (14.4MB) 100%
   |████████████████████████████████| 14.4MB 1.4MB/s
......................................
......................................
Successfully installed cycler-0.10.0 kiwisolver-1.1.0
matplotlib-3.1.1 pandas-0.25.0 pyparsing-2.4.2
python-dateutil-2.8.0 pytz-2019.2 seaborn-0.9.0

Keras Installation Using Python

截至目前,我们已经完成了安装 Kera 的基本要求。现在,使用如下所示的相同过程安装 Keras -

pip install keras

Quit virtual environment

在完成项目中的所有更改后,只需运行以下命令即可退出环境 -

deactivate

Anaconda Cloud

我们相信你已经在你的机器上安装了 anaconda cloud。如果未安装 anaconda,请访问官方链接, https://www.anaconda.com/download 并根据你的操作系统选择下载。

Create a new conda environment

启动 anaconda 提示,这将打开基础 Anaconda 环境。让我们创建一个新的 conda 环境。此过程类似于 virtualenv。在你的 conda 终端中键入以下命令 -

conda create --name PythonCPU

如果你愿意,你还可以使用 GPU 创建和安装模块。在本教程中,我们遵循 CPU 说明。

Activate conda environment

要激活环境,请使用以下命令 -

activate PythonCPU

Install spyder

Spyder 是用于执行 python 应用程序的 IDE。让我们使用以下命令在我们的 conda 环境中安装这个 IDE -

conda install spyder

Install python libraries

我们已经知道 keras 所需的 python 库 numpy、pandas 等。你可以使用以下语法安装所有模块 -

Syntax

conda install -c anaconda <module-name>

例如,你想要安装 pandas -

conda install -c anaconda pandas

与相同的方法一样,尝试自己安装剩余的模块。

Install Keras

现在,一切都看起来不错,所以你可以使用以下命令开始 keras 安装 -

conda install -c anaconda keras

Launch spyder

最后,使用以下命令在您的 conda 终端中启动 spyder −

spyder

为了确保一切都正确安装,导入所有模块,它会添加所有内容,如果出现任何问题,您将收到 module not found 错误消息。

Keras - Backend Configuration

本章详细解释了Keras后端实施TensorFlow和Theano。让我们逐一了解每个实施。

TensorFlow

TensorFlow 是 Google 开发的用于数字计算任务的开源机器学习库。Keras 是建立在 TensorFlow 或 Theano 之上的一个高级别 API。我们已经知道如何使用 pip 安装 TensorFlow。

如果没有安装,可以使用以下命令安装:

pip install TensorFlow

一旦执行 Keras,我们就能够看到配置文件位于你的主目录中,进入 .keras/keras.json。

keras.json

{
   "image_data_format": "channels_last",
   "epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow"
}

在此,

  1. image_data_format 代表数据格式。

  2. epsilon 代表数字常量。它用于避免 DivideByZero 错误。

  3. float*x represent the default data type *float32 。你也可以使用 set_floatx() 方法将其更改为 float16float64

  4. image_data_format 代表数据格式。

假设如果没有创建这个文件,那么就移动到相应位置,然后使用以下步骤创建:

> cd home
> mkdir .keras
> vi keras.json

记住,你应该将其文件夹名称指定为 .keras,并在 keras.json 文件中添加以上配置。我们可以执行一些预定义的操作以了解后端函数。

Theano

Theano 是一个开源深度学习库,允许你高效地计算多维数组。我们可以使用以下命令轻松安装:

pip install theano

默认情况下,Keras 使用 TensorFlow 后端。如果你想把后端配置从 TensorFlow 更改为 Theano,只需在 keras.json 文件中将 backend = theano 更改一下即可。如下所述:

keras.json

{
   "image_data_format": "channels_last",
   "epsilon": 1e-07,
   "floatx": "float32",
   "backend": "theano"
}

现在,保存你的文件,重启终端并启动 Keras,你的后端将会被更改。

>>> import keras as k
using theano backend.

Keras - Overview of Deep learning

深度学习是机器学习的一个不断发展中的子领域。深度学习涉及对输入进行逐层分析,每一层逐渐提取关于输入的高级信息。

让我们分析一张图像,以作为一种简单的情景。让我们假设你的输入图像被分成一个矩形的像素网格。现在,第一层对像素进行抽象。第二层理解图像中的边缘。下一层从边缘构建节点。然后,下一层将从节点中找到分支。最后,输出层将检测整个对象。在这里,特征提取过程从一层输出进入下一层输入。

通过使用这种方法,我们可以处理大量的特征,这使得深度学习成为一个非常强大的工具。深度学习算法也适用于非结构化数据分析。让我们在本章中学习深度学习的基础知识。

Artificial Neural Networks

深度学习最流行和最主要的方法是使用“人工神经网络”(ANN)。它们受到人类大脑模型的启发,而大脑是我们身体最复杂的器官。人脑由超过 900 亿个称为“神经元”的微小细胞组成。神经元通过称为“轴突”和“树突”的神经纤维相互连接。轴突的主要作用是将信息从一个神经元传送到另一个神经元,也就是与它相连的神经元。

类似地,树突的主要作用是接收与之相连的另一个神经元的轴突所传输的信息。每个神经元处理少量信息,然后将结果传递给另一个神经元,这个过程不断进行。这就是我们人类大脑处理大量信息(如语言、视觉等)并从中提取有用信息的基本方法。

基于这个模型,第一个人工神经网络(ANN)是由心理学家 Frank Rosenblatt 于 1958 年发明的。ANN 由多个节点组成,类似于神经元。节点紧密相连,并组织成不同的隐藏层。输入层接收输入数据,数据依次经过一个或多个隐藏层,最后输出层预测一些关于输入数据的有用信息。例如,输入可能是一幅图像,而输出可能是图像中识别的物体,比如“猫”。

一个单神经元(在 ANN 中被称为感知器)可以表示为以下形式:

artificial neural networks

在此,

  1. 多个输入连同权重一起代表树突。

  2. 输入总和和激活函数表示神经元。 Sum 实际上表示所有输入和激活函数的计算值,表示将 Sum 值修改为 0、1 或 0 到 1 的函数。

  3. 实际输出表示轴突,输出将由下一层中的神经元接收。

让我们在此部分了解不同类型的人工神经网络。

Multi-Layer Perceptron

多层感知器是 ANN 最简单的形式。它由一个输入层、一个或多个隐藏层以及最终一个输出层组成。一层由感知器的集合组成。输入层基本上是输入数据的一个或多个特征。每个隐藏层都包含一个或多个神经元,处理特征的某些方面并将其处理后的信息发送到下一个隐藏层。输出层处理从最后一个隐藏层接收数据并最终输出结果。

multi layer perceptron

Convolutional Neural Network (CNN)

卷积神经网络是其中一项最流行的 ANN。它广泛应用于图像和视频识别领域。它基于卷积的概念,这是一个数学概念。它几乎与多层感知器相似,只不过在完全连接的隐藏神经元层之前包含一系列卷积层和池化层。它有三个重要层数 −

  1. Convolution layer − 它是主要的构建模块,基于卷积功能执行计算任务。

  2. Pooling layer − 它布置在卷积层旁边,用于通过去除不需要的信息来减小输入的尺寸,从而可以更快地执行计算。

  3. Fully connected layer − 它布置在卷积和池化层系列的旁边,将输入分门别类。

一个简单的 CNN 可以表示如下 −

cnn

在此,

  1. 使用了 2 系列卷积和池化层,它接收和处理输入(例如图像)。

  2. 使用了一个完全连接层,它用于输出数据(例如图像分类)。

Recurrent Neural Network (RNN)

循环神经网络 (RNN) 对于解决其他 ANN 模型中的缺陷很有用。好,大多数 ANN 不会记住以前情况的步骤,而是学习根据训练中的上下文做出决策。与此同时,RNN 存储过去的信息,其所有决策都是基于从过去学到的内容做出的。

此方法主要用于图像分类。有时,我们可能需要展望未来才能解决过去。在这种情况下,双向 RNN 有助于从过去学习并预测未来。例如,我们有来自多个输入的手写样本。假设我们对一个输入感到困惑,那么我们需要再次检查其他输入,以识别出从过去做出决定的正确上下文。

Workflow of ANN

让我们先了解深度学习的不同阶段,然后了解 Keras 如何帮助深度学习过程。

Collect required data

深度学习需要大量输入数据才能成功学习和预测结果。因此,首先尽可能多地收集数据。

Analyze data

分析数据并很好地理解数据。选择正确的 ANN 算法需要更好地理解数据。

Choose an algorithm (model)

选择最适合学习过程类型(例如图像分类、文本处理等)和可用输入数据的算法。算法由 Keras 中的 Model 表示。算法包括一个或多个图层。ANN 中的每一层都可以在 Keras 中由 Keras Layer 表示。

  1. Prepare data − 只处理、过滤和选择来自数据所需的信息。

  2. Split data − 将数据拆分为训练集和测试数据集。测试数据将用于评估算法/模型的预测(一旦机器学习)并交叉检查学习过程的效率。

  3. Compile the model - 编译算法/模型,以便进一步用于训练学习,并最终用于预测。此步骤要求我们选择损失函数和优化器。损失函数和优化器用于学习阶段,以找到错误(与实际输出的偏差)并进行优化,以便将错误最小化。

  4. Fit the model - 将使用训练数据集在此阶段完成实际学习过程。

  5. Predict result for unknown value - 预测未知输入数据(除现有的训练和测试数据外)的输出

  6. Evaluate model - 通过预测测试数据的输出,交叉比较预测值与测试数据的实际结果,来评估模型。

  7. Freeze, Modify or choose new algorithm - 检查模型评估是否成功。如果是,则保存算法以用于未来的预测。如果不是,则修改或选择新的算法/模型,最后,再次训练、预测和评估模型。重复该过程,直至找到最佳算法(模型)。

上面的步骤可以使用以下流程图表示 -

ann

Keras - Deep learning

Keras 提供了一个完整的框架来创建任何类型的卷积神经网络。Keras 具有创新性,并且非常易于学习。它支持从简单神经网络到非常大和复杂的神经网络模型。在本章中,让我们了解 Keras 框架的架构以及 Keras 如何帮助进行深度学习。

Architecture of Keras

Keras API 可分为三大类 -

  1. Model

  2. Layer

  3. Core Modules

在 Keras 中,每个 ANN 都由 Keras Models 表示。反过来,每个 Keras 模型都是 Keras Layers 的组成,并表示 ANN 层,如输入、隐藏层、输出层、卷积层、池化层等,Keras 模型和层访问 Keras modules 以获取激活函数、损失函数、正则化函数等。使用 Keras 模型、Keras 层和 Keras 模块,任何 ANN 算法(CNN、RNN 等)都可以用简单有效的方式表示。

下图描述了模型、层和核心模块之间的关系 -

architecture of keras

让我们来看一下 Keras 模型、Keras 层和 Keras 模块的概述。

Model

Keras 模型有两种类型,如下所述 -

Sequential Model - 顺序模型基本上是 Keras 层的线性组合。顺序模型简单、最小,并有能力表示几乎所有可用的神经网络。

一个简单的顺序模型如下 -

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,)))

其中,

  1. Line 1 从 Keras 模型导入 Sequential 模型

  2. Line 2 导入 Dense 层和 Activation 模块

  3. Line 4 使用 Sequential API 创建一个新的顺序模型

  4. Line 5 添加一个具有 relu 激活(使用激活模块)功能的密集层(密集 API)。

Sequential 模型公开 Model 类以创建自定义模型。我们可以使用子类化概念来创建我们自己的复杂模型。

Functional API − Functional API 基本上可用于创建复杂模型。

Layer

Keras 模型中的每个 Keras 层代表实际提议的神经网络模型中的相应层(输入层、隐藏层和输出层)。Keras 提供了许多预构建的层,以便轻松创建任何复杂的神经网络。以下是其中一些重要的 Keras 层:

  1. Core Layers

  2. Convolution Layers

  3. Pooling Layers

  4. Recurrent Layers

一个用于表示使用 sequential 模型的神经网络模型的简单 python 代码如下所示 −

from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout model = Sequential()

model.add(Dense(512, activation = 'relu', input_shape = (784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2))
model.add(Dense(num_classes, activation = 'softmax'))

其中,

  1. Line 1 从 Keras 模型导入 Sequential 模型

  2. Line 2 导入 Dense 层和 Activation 模块

  3. Line 4 使用 Sequential API 创建一个新的顺序模型

  4. Line 5 添加一个具有 relu 激活(使用激活模块)功能的密集层(密集 API)。

  5. Line 6 添加一个 dropout 层(Dropout API)来处理过拟合。

  6. Line 7 添加另一个密集层(Dense API),激活功能为 relu (使用 Activation 模块)。

  7. Line 8 添加另一个 dropout 层(Dropout API)来处理过拟合。

  8. Line 9 添加最终的密集层(Dense API),激活功能为 softmax (使用 Activation 模块)。

Keras 还提供创建我们自己的自定义层。可以通过对 Keras.Layer 类进行子分类来创建自定义层,它类似于对 Keras 模型进行子分类。

Core Modules

Keras 还提供许多内置的神经网络相关函数来正确创建 Keras 模型和 Keras 层。以下是一些函数:

  1. Activations module − 激活函数是 ANN 中的一个重要概念,激活模块提供了 softmax、relu 等许多激活函数。

  2. Loss module − 损失模块提供均方误差、平均绝对误差、泊松等损失函数。

  3. Optimizer module − 优化器模块提供 adam、sgd 等优化器函数。

  4. Regularizers − 正则化器模块提供 L1 正则化器、L2 正则化器等函数。

让我们在后续章节中详细了解 Keras 模块。

Keras - Modules

正如我们先前了解的,Keras 模块包含预定义的类、函数和变量,它们对深度学习算法非常有用。让我们在本节中了解 Keras 提供的模块。

Available modules

让我们首先查看 Keras 中可用模块的列表。

  1. Initializers − 提供初始化器函数的列表。我们可以在 Keras 层章节中详细了解它。在机器学习的模型创建阶段。

  2. Regularizers − 提供正则化器函数的列表。我们可以在 Keras 层章节中详细了解它。

  3. Constraints − 提供约束函数的列表。我们可以在 Keras 层章节中详细了解它。

  4. Activations − 提供激活函数列表。我们可以在 Keras 层章节中详细了解它。

  5. Losses − 提供损失函数列表。我们可以在模型训练章节中详细了解它。

  6. Metrics − 提供度量函数列表。我们可以在模型训练章节中详细了解它。

  7. Optimizers − 提供优化器函数列表。我们可以在模型训练章节中详细了解它。

  8. Callback − 提供回调函数列表。我们可以在训练过程中使用它来打印中间数据,并根据某些条件停止训练本身( EarlyStopping 方法)。

  9. Text processing − 提供将文本转换为适合机器学习的 NumPy 数组的函数。我们可以在机器学习的数据准备阶段使用它。

  10. Image processing − 提供将图像转换为适合机器学习的 NumPy 数组的函数。我们可以在机器学习的数据准备阶段使用它。

  11. Sequence processing − 提供从给定输入数据生成基于时间的函数数据。我们可以在机器学习的数据准备阶段使用它。

  12. Backend − 提供后台库函数,如 TensorFlow 和 Theano。

  13. Utilities − 提供大量深度学习中有用的实用程序函数。

让我们在本节中了解 backend 模块和 utils 模型。

backend module

backend module 用于 keras 后台操作。默认情况下,keras 在 TensorFlow 后台上运行。如果您愿意,您可以切换到其他后端,如 Theano 或 CNTK。Deufalt 后台配置在您的根目录下的 .keras/keras.json 文件中定义。

可以使用以下代码导入 Keras 后台模块

>>> from keras import backend as k

如果我们使用默认后端 TensorFlow,那么以下函数将返回如下指定的基于 TensorFlow 的信息 −

>>> k.backend()
'tensorflow'
>>> k.epsilon()
1e-07
>>> k.image_data_format()
'channels_last'
>>> k.floatx()
'float32'

让我们简要了解一些用于数据分析的重要后台函数 −

get_uid()

它是默认图形的标识符。它在下面定义 −

>>> k.get_uid(prefix='')
1
>>> k.get_uid(prefix='') 2

reset_uids

它用于重置 uid 值。

>>> k.reset_uids()

现在,再次执行 get_uid()。这将被重置,并再次变为 1。

>>> k.get_uid(prefix='')
1

placeholder

用于实例化占位符张量。简单的占位符以保存 3D 形状的示例如下 −

>>> data = k.placeholder(shape = (1,3,3))
>>> data
<tf.Tensor 'Placeholder_9:0' shape = (1, 3, 3) dtype = float32>

If you use int_shape(), it will show the shape.

>>> k.int_shape(data) (1, 3, 3)

dot

它用于将两个张量相乘。考虑 a 和 b 是两个张量,而 c 将是 ab 乘法的结果。假定 a 的形状是 (4,2),而 b 的形状是 (2,3)。它在下面定义,

>>> a = k.placeholder(shape = (4,2))
>>> b = k.placeholder(shape = (2,3))
>>> c = k.dot(a,b)
>>> c
<tf.Tensor 'MatMul_3:0' shape = (4, 3) dtype = float32>
>>>

ones

它用于将所有内容初始化为 one 值。

>>> res = k.ones(shape = (2,2))

#print the value

>>> k.eval(res)
array([[1., 1.], [1., 1.]], dtype = float32)

batch_dot

它用于对批次中的两个数据执行乘积。输入维度必须为 2 或更高。如下所示:

>>> a_batch = k.ones(shape = (2,3))
>>> b_batch = k.ones(shape = (3,2))
>>> c_batch = k.batch_dot(a_batch,b_batch)
>>> c_batch
<tf.Tensor 'ExpandDims:0' shape = (2, 1) dtype = float32>

variable

它用于初始化变量。让我们在这个变量中执行简单的转置操作。

>>> data = k.variable([[10,20,30,40],[50,60,70,80]])
#variable initialized here
>>> result = k.transpose(data)
>>> print(result)
Tensor("transpose_6:0", shape = (4, 2), dtype = float32)
>>> print(k.eval(result))
   [[10. 50.]
   [20. 60.]
   [30. 70.]
   [40. 80.]]

如果你希望从 numpy 访问:

>>> data = np.array([[10,20,30,40],[50,60,70,80]])

>>> print(np.transpose(data))
   [[10 50]
   [20 60]
   [30 70]
   [40 80]]

>>> res = k.variable(value = data)
>>> print(res)
<tf.Variable 'Variable_7:0' shape = (2, 4) dtype = float32_ref>

is_sparse(tensor)

它用于检查张量是否是稀疏张量。

>>> a = k.placeholder((2, 2), sparse=True)

>>> print(a) SparseTensor(indices =
   Tensor("Placeholder_8:0",
   shape = (?, 2), dtype = int64),
values = Tensor("Placeholder_7:0", shape = (?,),
dtype = float32), dense_shape = Tensor("Const:0", shape = (2,), dtype = int64))

>>> print(k.is_sparse(a)) True

to_dense()

它用于将稀疏张量转换为稠密张量。

>>> b = k.to_dense(a)
>>> print(b) Tensor("SparseToDense:0", shape = (2, 2), dtype = float32)
>>> print(k.is_sparse(b)) False

random_uniform_variable

它用于在 uniform distribution 概念下初始化。

k.random_uniform_variable(shape, mean, scale)

在此,

  1. shape - 以元组形式表示行和列。

  2. mean - 均匀分布的均值。

  3. scale - 均匀分布的标准差。

让我们看一下下面的示例用法:

>>> a = k.random_uniform_variable(shape = (2, 3), low=0, high = 1)
>>> b = k. random_uniform_variable(shape = (3,2), low = 0, high = 1)
>>> c = k.dot(a, b)
>>> k.int_shape(c)
(2, 2)

utils module

utils 提供了深度学习的有用实用程序函数。 utils 模块提供的一些方法如下:

HDF5Matrix

它用于以 HDF5 格式表示输入数据。

from keras.utils import HDF5Matrix data = HDF5Matrix('data.hdf5', 'data')

to_categorical

它用于将类别向量转换为二进制类别矩阵。

>>> from keras.utils import to_categorical
>>> labels = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> to_categorical(labels)
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype = float32)
>>> from keras.utils import normalize
>>> normalize([1, 2, 3, 4, 5])
array([[0.13483997, 0.26967994, 0.40451992, 0.53935989, 0.67419986]])

print_summary

它用于打印模型摘要。

from keras.utils import print_summary print_summary(model)

plot_model

它用于创建 dot 格式的模型表示形式并将其保存到文件中。

from keras.utils import plot_model
plot_model(model,to_file = 'image.png')

plot_model 将生成图像以了解模型的性能。

Keras - Layers

正如前面所学,Keras 层是 Keras 模型的主要构建块。每一层接收输入信息,进行一些计算,最后输出转换后的信息。一层输出将流入下一层作为其输入。让我们在此章节中了解有关层的完整详细信息。

Introduction

一个 Keras 层需要 shape of the input (input_shape) 以便了解输入数据的结构,需要 initializer 设置每个输入的权重,最后需要激活器将输出转化为非线性。中间用约束限制输入数据权重的生成范围,而正则化函数会通过在优化过程中动态地对权重施加惩罚,来尝试优化层(以及模型)。

总而言之,Keras 层需要以下最低细节信息才能创建一个完整的层。

  1. 输入数据形状

  2. 层中的神经元/单元数

  3. Initializers

  4. Regularizers

  5. Constraints

  6. Activations

让我们在下一章了解基本概念。在了解基本概念之前,让我们使用顺序模型 API 创建一个简单的 Keras 层,以便了解 Keras 模型和层的工作方式。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
from keras import regularizers
from keras import constraints

model = Sequential()

model.add(Dense(32, input_shape=(16,), kernel_initializer = 'he_uniform',
   kernel_regularizer = None, kernel_constraint = 'MaxNorm', activation = 'relu'))
model.add(Dense(16, activation = 'relu'))
model.add(Dense(8))

其中,

  1. Line 1-5 导入必要的模块。

  2. Line 7 使用顺序 API 创建一个新模型。

  3. Line 9 创建一个新的 Dense 层并将其添加到模型中。 Dense 是由 Keras 提供的入口层,它以神经元或单元数(32)作为其必需参数。如果该层是第一层,那么我们也需要提供 Input Shape, (16,) 。否则,将把前一层的输出用作下一层的输入。所有其他参数都是可选的。第一个参数表示单元(神经元)数。 input_shape 表示输入数据形状。 kernel_initializer 表示要使用的初始化器。 he_uniform 函数被设置为 value。 kernel_regularizer 表示要使用的 regularizer 。None 被设置为 value。 kernel_constraint 表示要使用的约束。 MaxNorm 函数被设置为 value。 activation 表示要使用的激活。relu 函数被设置为 value。

  4. Line 10 使用 16 个单元创建第二个 Dense 层,并将 relu 设置为激活函数。

  5. Line 11 使用 8 个单元创建最终的 Dense 层。

Basic Concept of Layers

让我们了解一下层的概念,以及 Keras 对每个概念的支持方式。

Input shape

在机器学习中,文本、图像或视频等的各种输入数据将首先转换为数字数组,然后馈送到算法中。输入数字可能是单维数组、二维数组(矩阵)或多维数组。我们可以使用整数元组 shape 指定维度信息。例如, (4,2) 表示具有四行两列的矩阵。

>>> import numpy as np
>>> shape = (4, 2)
>>> input = np.zeros(shape)
>>> print(input)
[
   [0. 0.]
   [0. 0.]
   [0. 0.]
   [0. 0.]
]
>>>

类似地, (3,4,2) 是三维矩阵,具有三个 4x2 矩阵集合(两行和四列)。

>>> import numpy as np
>>> shape = (3, 4, 2)
>>> input = np.zeros(shape)
>>> print(input)
[
   [[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
   [[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
   [[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
]
>>>

要创建模型的第一层(或模型的输入层),应指定输入数据形状。

Initializers

在机器学习中,所有输入数据都将分配权重。 Initializers 模块提供不同的函数来设置这些初始权重。其中一些 Keras Initializer 函数如下 −

Zeros

为所有输入数据生成 0

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.Zeros()
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

其中, kernel_initializer 表示模型内核的初始化器。

Ones

为所有输入数据生成 1

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.Ones()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

Constant

为所有输入数据生成用户指定的常数值(例如 5 )。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.Constant(value = 0) model.add(
   Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)

value 表示常数値

RandomNormal

使用输入数据的正态分布生成数值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.RandomNormal(mean=0.0,
stddev = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

其中,

  1. mean 表示要生成的随机数值的均值

  2. stddev 表示要生成的随机数值的标准差

  3. seed 表示生成随机数的数值

RandomUniform

使用输入数据的均匀分布生成数值。

from keras import initializers

my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

其中,

  1. minval 表示要生成的随机数值的下限

  2. maxval 表示要生成的随机数值的上限

TruncatedNormal

使用输入数据的截尾正态分布生成数值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.TruncatedNormal(mean = 0.0, stddev = 0.05, seed = None
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

VarianceScaling

基于该层输入形状和输出形状以及指定的缩放比例生成数值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.VarianceScaling(
   scale = 1.0, mode = 'fan_in', distribution = 'normal', seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   skernel_initializer = my_init))

其中,

  1. scale 表示缩放因子

  2. mode 表示 fan_in, fan_outfan_avg 中的任何一个数值

  3. distribution 表示 normaluniform 中的任何一个数值

VarianceScaling

它使用以下公式查找正态分布的 stddev ,然后再使用正态分布查找权重,

stddev = sqrt(scale / n)

n 表示,

  1. 模式的输入单元数量 = fan_in

  2. 模式的输出单元数量 = fan_out

  3. 模式的平均输入和输出单元数量 = fan_avg

类似地,它使用以下公式查找均匀分布的限制,然后再使用均匀分布查找权重,

limit = sqrt(3 * scale / n)

lecun_normal

利用输入数据的 lecun 正态分布来生成值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

它使用以下公式找到 stddev ,然后应用正态分布

stddev = sqrt(1 / fan_in)

其中, fan_in 表示输入单元的数量。

lecun_uniform

利用输入数据的 lecun 均匀分布来生成值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.lecun_uniform(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

它使用以下公式找到 limit ,然后应用均匀分布

limit = sqrt(3 / fan_in)

其中,

  1. fan_in 表示输入单元的数量

  2. fan_out 表示输出单元的数量

glorot_normal

利用输入数据的 glorot 正态分布来生成值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.glorot_normal(seed=None) model.add(
   Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)

它使用以下公式找到 stddev ,然后应用正态分布

stddev = sqrt(2 / (fan_in + fan_out))

其中,

  1. fan_in 表示输入单元的数量

  2. fan_out 表示输出单元的数量

glorot_uniform

利用输入数据的 glorot 均匀分布来生成值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.glorot_uniform(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

它使用以下公式找到 limit ,然后应用均匀分布

limit = sqrt(6 / (fan_in + fan_out))

其中,

  1. fan_in 表示输入单元的数量。

  2. fan_out 表示输出单元的数量

he_normal

利用输入数据的 he 正态分布来生成值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

它使用以下公式找到 stddev,然后应用正态分布。

stddev = sqrt(2 / fan_in)

其中, fan_in 表示输入单元的数量。

he_uniform

利用输入数据的 he 均匀分布来生成值。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.he_normal(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

它使用以下公式找到 limit ,然后应用均匀分布。

limit = sqrt(6 / fan_in)

其中, fan_in 表示输入单元的数量。

Orthogonal

生成一个随机正交矩阵。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.Orthogonal(gain = 1.0, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init))

其中, gain 是矩阵的乘法因子。

Identity

生成单位矩阵。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.Identity(gain = 1.0) model.add(
   Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)

Constraints

在机器学习中,将在优化过程中对参数(权重)设置约束。<>Constraints 模块提供了不同的功能来设置该层上的约束。某些约束功能如下所示。

NonNeg

将权重限制为非负数。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers

my_init = initializers.Identity(gain = 1.0) model.add(
   Dense(512, activation = 'relu', input_shape = (784,),
   kernel_initializer = my_init)
)

其中, kernel_constraint 表示层中要使用的约束。

UnitNorm

将权重限制为单位范数。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import constraints

my_constrain = constraints.UnitNorm(axis = 0)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_constraint = my_constrain))

MaxNorm

将权重限制为小于或等于给定值的范数。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import constraints

my_constrain = constraints.MaxNorm(max_value = 2, axis = 0)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_constraint = my_constrain))

其中,

  1. max_value 表示上限

  2. axis 表示要应用约束的维度。例如,在 Shape (2,3,4) 中,axis 0 表示第一维,1 表示第二维,2 表示第三维

MinMaxNorm

将权重限制为指定最小值和最大值之间的范数。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import constraints

my_constrain = constraints.MinMaxNorm(min_value = 0.0, max_value = 1.0, rate = 1.0, axis = 0)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_constraint = my_constrain))

其中, rate 表示应用权重约束的速率。

Regularizers

在机器学习中,正则化在优化阶段使用。在优化过程中对层参数应用一些惩罚。Keras 正则化模块提供以下函数来对层设置惩罚。正则化仅按层应用。

L1 Regularizer

它提供基于 L1 的正则化。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import regularizers

my_regularizer = regularizers.l1(0.)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_regularizer = my_regularizer))

其中, kernel_regularizer 表示应用权重约束的速率。

L2 Regularizer

它提供基于 L2 的正则化。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import regularizers

my_regularizer = regularizers.l2(0.)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_regularizer = my_regularizer))

L1 and L2 Regularizer

它提供基于 L1 和 L2 的正则化。

from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import regularizers

my_regularizer = regularizers.l2(0.)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
   kernel_regularizer = my_regularizer))

Activations

在机器学习中,激活函数是一种特殊函数,用于发现特定的神经元是否被激活。基本上,激活函数对输入数据执行非线性变换,从而使神经元能够更好地学习。神经元的输出取决于激活函数。

当你回想单一感知的概念时,感知器(神经元)的输出仅仅是激活函数的结果,激活函数接受所有输入与其对应权重的总和乘以其结果加上整体偏差(如果可用的话)。

result = Activation(SUMOF(input * weight) + bias)

因此,激活函数在模型的成功学习中发挥着重要的作用。Keras 在 activations 模块中提供了很多激活函数。让我们了解模块中所有可用的激活函数。

linear

应用线性函数。不进行任何操作。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'linear', input_shape = (784,)))

其中, activation 引用层的激活函数。它可以通过函数名称指定,该层将使用相应的激活器。

elu

应用指数线性单元。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'elu', input_shape = (784,)))

selu

应用比例指数线性单元。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'selu', input_shape = (784,)))

relu

应用整流线性单元。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,)))

softmax

应用 Softmax 函数。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'softmax', input_shape = (784,)))

softplus

应用 Softplus 函数。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'softplus', input_shape = (784,)))

softsign

应用 Softsign 函数。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'softsign', input_shape = (784,)))

tanh

应用双曲正切函数。

from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'tanh', input_shape = (784,)))

sigmoid

应用 Sigmoid 函数。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'sigmoid', input_shape = (784,)))

hard_sigmoid

应用 Hard Sigmoid 函数。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'hard_sigmoid', input_shape = (784,)))

exponential

应用指数函数。

from keras.models import Sequential
from keras.layers import Activation, Dense

model = Sequential()
model.add(Dense(512, activation = 'exponential', input_shape = (784,)))

Sr.No

Layers & Description

1

Dense Layer Dense layer 为常规的深度连接神经网络层。

2

Dropout Layers Dropout 是机器学习中的一个重要概念。

3

Flatten Layers Flatten 用于展平输入。

4

Reshape Layers Reshape 用于更改输入的形状。

5

Permute Layers Permute 也用于使用模式更改输入的形状。

6

RepeatVector Layers RepeatVector 用于将输入重复指定次数 n。

7

Lambda Layers Lambda 用于使用表达式或函数转换输入数据。

8

Convolution Layers Keras 包含许多基于卷积层的 ANN,通常称为卷积神经网络 (CNN)。

9

Pooling Layer 用于对时间数据执行最大池化操作。

10

Locally connected layer 局部连接层与 Conv1D 层类似,但区别是 Conv1D 层权重是共享的,但此处的权重是不共享的。

11

Merge Layer 用于合并输入列表。

12

Embedding Layer 它在输入层中执行嵌入操作。

Keras - Customized Layer

Keras 允许创建我们自己的自定义层。一旦创建一个新层,它就可以在任何模型中毫无限制地使用。让我们在这章中学习如何创建新层。

Keras 提供了一个基础 layer 类,Layer 可以对其进行子类化以创建我们自己的自定义层。让我们创建一个简单的层,它将根据正态分布找到权重,然后在训练期间对输入及其权重的乘积求和进行基本计算。

Step 1: Import the necessary module

首先,让我们导入必要的模块 −

from keras import backend as K
from keras.layers import Layer

在此,

  1. backend 用于访问 dot 函数。

  2. Layer 是基础类,我们将对其进行子类化以创建我们的层

Step 2: Define a layer class

让我们通过对 Layer class 进行子类化来创建一个新类 MyCustomLayer

class MyCustomLayer(Layer):
   ...

Step 3: Initialize the layer class

让我们如下所示初始化我们的新类 −

def __init__(self, output_dim, **kwargs):
   self.output_dim = output_dim
   super(MyCustomLayer, self).__init__(**kwargs)

在此,

  1. Line 2 设置输出维度。

  2. Line 3 调用基础层或超层的 init 函数。

Step 4: Implement build method

build 是主要方法,其唯一目的是正确构建层。它可以执行与层内部工作相关的任何操作。完成自定义功能后,我们可以调用基础类 build 函数。我们的自定义 build 函数如下 −

def build(self, input_shape):
   self.kernel = self.add_weight(name = 'kernel',
      shape = (input_shape[1], self.output_dim),
      initializer = 'normal', trainable = True)
   super(MyCustomLayer, self).build(input_shape)

在此,

  1. Line 1 使用一个参数 input_shape 定义 build 方法。输入数据的形状由 input_shape 引用。

  2. Line 2 创建与输入形状相对应的权重,并将其设置在 kernel 中。这是我们层的自定义功能。它使用“正态”初始化器创建权重。

  3. Line 6 调用基础类 build 方法。

Step 5: Implement call method

call 方法在训练过程中执行层的精确工作。

我们的自定义 call 方法如下

def call(self, input_data):
   return K.dot(input_data, self.kernel)

在此,

  1. Line 1 用一个参数 input_data 定义 call 方法。input_data 是我们层的输入数据。

  2. Line 2 返回输入数据 input_data 和我们层的核 self.kernel 的点积

Step 6: Implement compute_output_shape method

def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)

在此,

  1. Line 1compute_output_shape 方法定义了一个参数 input_shape

  2. Line 2 在初始化层的同时,使用输入数据的形状和输出维度设置来计算输出形状。

实现 build, callcompute_output_shape ,即完成了创建自定义层。最终的完整代码如下:

from keras import backend as K from keras.layers import Layer
class MyCustomLayer(Layer):
   def __init__(self, output_dim, **kwargs):
      self.output_dim = output_dim
      super(MyCustomLayer, self).__init__(**kwargs)
   def build(self, input_shape): self.kernel =
      self.add_weight(name = 'kernel',
      shape = (input_shape[1], self.output_dim),
      initializer = 'normal', trainable = True)
      super(MyCustomLayer, self).build(input_shape) #
      Be sure to call this at the end
   def call(self, input_data): return K.dot(input_data, self.kernel)
   def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)

Using our customized layer

我们创建一个简单的模型,使用如下指定得自定义层:

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(MyCustomLayer(32, input_shape = (16,)))
model.add(Dense(8, activation = 'softmax')) model.summary()

在此,

  1. 我们的 MyCustomLayer 被添加到模型中,使用 32 个单元和 (16,) 作为输入形状

运行应用程序将打印模型摘要,如下所示:

Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param
#================================================================
my_custom_layer_1 (MyCustomL (None, 32) 512
_________________________________________________________________
dense_1 (Dense) (None, 8) 264
=================================================================
Total params: 776
Trainable params: 776
Non-trainable params: 0
_________________________________________________________________

Keras - Models

正如前面所学习的,Keras 模型表示实际神经网络模型。Keras 提供了两种创建模型的方法,简单易用的顺序 API 及更灵活、高级的功能 API。让我们在此章节中学习如何同时使用顺序 API 和功能 API 创建模型。

Sequential

Sequential API 的核心思想很简单,就是按顺序排列 Keras 层,因此,它被称为顺序 API。大多数 ANN 的层也按顺序排列,数据按照给定顺序从一个层流到另一个层,直至数据最终到达输出层。

可以通过简单地调用 Sequential() API 来创建 ANN 模型,如下所示 −

from keras.models import Sequential
model = Sequential()

Add layers

要添加一个层,只需使用 Keras 层 API 创建一个层,然后按照如下所示通过 add() 函数传递该层 −

from keras.models import Sequential

model = Sequential()
input_layer = Dense(32, input_shape=(8,)) model.add(input_layer)
hidden_layer = Dense(64, activation='relu'); model.add(hidden_layer)
output_layer = Dense(8)
model.add(output_layer)

在此,我们创建了一个输入层、一个隐藏层和一个输出层。

Access the model

Keras 提供了几种方法来获取模型信息,例如层、输入数据和输出数据。它们如下所示 −

  1. model.layers − 以列表形式返回模型的所有层。

>>> layers = model.layers
>>> layers
[
   <keras.layers.core.Dense object at 0x000002C8C888B8D0>,
   <keras.layers.core.Dense object at 0x000002C8C888B7B8>
   <keras.layers.core.Dense object at 0x 000002C8C888B898>
]
  1. model.inputs − 以列表形式返回模型的所有输入张量。

>>> inputs = model.inputs
>>> inputs
[<tf.Tensor 'dense_13_input:0' shape=(?, 8) dtype=float32>]
  1. model.outputs − 以列表形式返回模型的所有输出张量。

>>> outputs = model.outputs
>>> outputs
<tf.Tensor 'dense_15/BiasAdd:0' shape=(?, 8) dtype=float32>]
  1. model.get_weights − 以 NumPy 数组形式返回所有权重。

  2. model.set_weights(weight_numpy_array) − 设置模型的权重。

Serialize the model

Keras 提供了一些方法,将模型序列化为对象以及 json,并稍后重新加载它。它们如下所示 −

  1. get_config() − 以对象形式返回模型。

config = model.get_config()
  1. from_config() − 它接受模型配置对象作为参数,并相应地创建模型。

new_model = Sequential.from_config(config)
  1. to_json() − 以 json 对象形式返回模型。

>>> json_string = model.to_json()
>>> json_string '{"class_name": "Sequential", "config":
{"name": "sequential_10", "layers":
[{"class_name": "Dense", "config":
{"name": "dense_13", "trainable": true, "batch_input_shape":
[null, 8], "dtype": "float32", "units": 32, "activation": "linear",
"use_bias": true, "kernel_initializer":
{"class_name": "Vari anceScaling", "config":
{"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}},
"bias_initializer": {"class_name": "Zeros", "conf
ig": {}}, "kernel_regularizer": null, "bias_regularizer": null,
"activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}},
{" class_name": "Dense", "config": {"name": "dense_14", "trainable": true,
"dtype": "float32", "units": 64, "activation": "relu", "use_bias": true,
"kern el_initializer": {"class_name": "VarianceScaling", "config":
{"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}},
"bias_initia lizer": {"class_name": "Zeros",
"config": {}}, "kernel_regularizer": null, "bias_regularizer": null,
"activity_regularizer": null, "kernel_constraint" : null, "bias_constraint": null}},
{"class_name": "Dense", "config": {"name": "dense_15", "trainable": true,
"dtype": "float32", "units": 8, "activation": "linear", "use_bias": true,
"kernel_initializer": {"class_name": "VarianceScaling", "config":
{"scale": 1.0, "mode": "fan_avg", "distribution": " uniform", "seed": null}},
"bias_initializer": {"class_name": "Zeros", "config": {}},
"kernel_regularizer": null, "bias_regularizer": null, "activity_r egularizer":
null, "kernel_constraint": null, "bias_constraint":
null}}]}, "keras_version": "2.2.5", "backend": "tensorflow"}'
>>>
  1. 用json表示接受模型并创建一个新模型。

from keras.models import model_from_json
new_model = model_from_json(json_string)
  1. 返回模型作为yaml字符串。

>>> yaml_string = model.to_yaml()
>>> yaml_string 'backend: tensorflow\nclass_name:
Sequential\nconfig:\n layers:\n - class_name: Dense\n config:\n
activation: linear\n activity_regular izer: null\n batch_input_shape:
!!python/tuple\n - null\n - 8\n bias_constraint: null\n bias_initializer:\n
class_name : Zeros\n config: {}\n bias_regularizer: null\n dtype:
float32\n kernel_constraint: null\n
kernel_initializer:\n cla ss_name: VarianceScaling\n config:\n
distribution: uniform\n mode: fan_avg\n
scale: 1.0\n seed: null\n kernel_regularizer: null\n name: dense_13\n
trainable: true\n units: 32\n
use_bias: true\n - class_name: Dense\n config:\n activation: relu\n activity_regularizer: null\n
bias_constraint: null\n bias_initializer:\n class_name: Zeros\n
config : {}\n bias_regularizer: null\n dtype: float32\n
kernel_constraint: null\n kernel_initializer:\n class_name: VarianceScalin g\n
config:\n distribution: uniform\n mode: fan_avg\n scale: 1.0\n
seed: null\n kernel_regularizer: nu ll\n name: dense_14\n trainable: true\n
units: 64\n use_bias: true\n - class_name: Dense\n config:\n
activation: linear\n activity_regularizer: null\n
bias_constraint: null\n bias_initializer:\n
class_name: Zeros\n config: {}\n bias_regu larizer: null\n
dtype: float32\n kernel_constraint: null\n
kernel_initializer:\n class_name: VarianceScaling\n config:\n
distribution: uniform\n mode: fan_avg\n
scale: 1.0\n seed: null\n kernel_regularizer: null\n name: dense _15\n
trainable: true\n units: 8\n
use_bias: true\n name: sequential_10\nkeras_version: 2.2.5\n'
>>>
  1. 接受模型的yaml表示并创建一个新模型。

from keras.models import model_from_yaml
new_model = model_from_yaml(yaml_string)

Summarise the model

了解模型对于正确应用其培训和预测非常重要。Keras提供了一个简单的方法摘要,以获取有关模型及其层的完整信息。

在上一部分中创建的模型的摘要如下:

>>> model.summary() Model: "sequential_10"
_________________________________________________________________
Layer (type) Output Shape Param
#================================================================
dense_13 (Dense) (None, 32) 288
_________________________________________________________________
dense_14 (Dense) (None, 64) 2112
_________________________________________________________________
dense_15 (Dense) (None, 8) 520
=================================================================
Total params: 2,920
Trainable params: 2,920
Non-trainable params: 0
_________________________________________________________________
>>>

Train and Predict the model

模型提供了用于训练、评估和预测过程的功能。如下所示:

  1. 配置模型的学习过程

  2. 使用训练数据训练模型

  3. 使用测试数据评估模型

  4. 预测新输入的结果。

Functional API

顺序API用于逐层地创建模型。函数API是创建更复杂模型的另一种方法。函数模型,您可以定义多个输入或输出共享层。首先,我们为模型创建实例并连接到访问模型输入和输出的层。本章节简要解释了函数模型。

Create a model

使用以下模块导入输入层:

>>> from keras.layers import Input

现在,使用以下代码,为模型指定输入尺寸形状创建输入层:

>>> data = Input(shape=(2,3))

使用以下模块定义输入层的层:

>>> from keras.layers import Dense

使用以下代码行,为输入添加密集层:

>>> layer = Dense(2)(data)
>>> print(layer)
Tensor("dense_1/add:0", shape =(?, 2, 2), dtype = float32)

使用以下模块定义模型:

from keras.models import Model

通过指定输入和输出层,以函数的方式创建模型:

model = Model(inputs = data, outputs = layer)

下面显示了创建简单模型的完整代码:

from keras.layers import Input
from keras.models import Model
from keras.layers import Dense

data = Input(shape=(2,3))
layer = Dense(2)(data) model =
Model(inputs=data,outputs=layer) model.summary()
_________________________________________________________________
Layer (type)               Output Shape               Param #
=================================================================
input_2 (InputLayer)       (None, 2, 3)               0
_________________________________________________________________
dense_2 (Dense)            (None, 2, 2)               8
=================================================================
Total params: 8
Trainable params: 8
Non-trainable params: 0
_________________________________________________________________

Keras - Model Compilation

我们之前已经学习了如何使用顺序 API 和函数 API 来创建模型的基础。本章将讲解如何编译模型。编译是创建模型的最后一步。编译完成后,我们就可以继续进入训练阶段了。

让我们学习一些概念,以更好地了解编译过程。

Loss

在机器学习中, Loss 函数用于找出学习过程中的错误或偏差。Keras 在模型编译过程中需要损失函数。

Keras 在 losses 模块中提供了很多损失函数,如下所示:

  1. mean_squared_error

  2. mean_absolute_error

  3. mean_absolute_percentage_error

  4. mean_squared_logarithmic_error

  5. squared_hinge

  6. hinge

  7. categorical_hinge

  8. logcosh

  9. huber_loss

  10. categorical_crossentropy

  11. sparse_categorical_crossentropy

  12. binary_crossentropy

  13. kullback_leibler_divergence

  14. poisson

  15. cosine_proximity

  16. is_categorical_crossentropy

所有以上损失函数接受两个参数:

  1. y_true − 真实标签作为张量

  2. y_pred − 与 y_true 形状相同的预测

在使用损失函数之前导入损失模块,如下所示:

from keras import losses

Optimizer

在机器学习中, Optimization 是一个通过比较预测与损失函数来优化输入权重的重要过程。Keras 提供了很多优化模块,即优化器,如下所示:

SGD − 随机梯度下降优化器。

keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)

RMSprop − RMSProp 优化器。

keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)

Adagrad − Adagrad 优化器。

keras.optimizers.Adagrad(learning_rate = 0.01)

Adadelta − Adadelta 优化器。

keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)

Adam − Adam 优化器。

keras.optimizers.Adam(
   learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)

Adamax − 来自 Adam 的 Adamax 优化器。

keras.optimizers.Adamax(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)

Nadam − Nesterov Adam 优化器。

keras.optimizers.Nadam(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)

在使用优化器之前导入优化器模块,如下所示:

from keras import optimizers

Metrics

在机器学习中, Metrics 用于评估你模型的性能。它与损失函数类似,但不用于训练过程中。Keras 提供了很多指标模块,即 metrics ,如下所示:

  1. accuracy

  2. binary_accuracy

  3. categorical_accuracy

  4. sparse_categorical_accuracy

  5. top_k_categorical_accuracy

  6. sparse_top_k_categorical_accuracy

  7. cosine_proximity

  8. clone_metric

同损失函数类似,指标也接受以下两个参数 −

  1. y_true − 真实标签作为张量

  2. y_pred − 与 y_true 形状相同的预测

在使用指标之前,导入指标模块,如下所示 −

from keras import metrics

Compile the model

Keras 模型提供 compile() 方法来编译模型。 compile() 方法的参数和默认值为以下内容

compile(
   optimizer,
   loss = None,
   metrics = None,
   loss_weights = None,
   sample_weight_mode = None,
   weighted_metrics = None,
   target_tensors = None
)

重要参数如下 −

  1. loss function

  2. Optimizer

  3. metrics

编译模式的示例代码如下 −

from keras import losses
from keras import optimizers
from keras import metrics

model.compile(loss = 'mean_squared_error',
   optimizer = 'sgd', metrics = [metrics.categorical_accuracy])

其中,

  1. 损失函数设置为 mean_squared_error

  2. 优化器设置为 sgd

  3. 指标设置为 metrics.categorical_accuracy

Model Training

模型通过 fit() 使用 NumPy 数组进行训练。此拟合函数的主要目的是根据训练评估您的模型。它还可以用于绘制模型性能。它具有以下语法 −

model.fit(X, y, epochs = , batch_size = )

在此,

  1. X, y − 它是一个元组,用于评估您的数据。

  2. epochs − 在培训期间需要对模型进行评估的次数。

  3. batch_size − training instances.

让我们以上述概念为例,使用 numpy 随机数据。

Create data

让我们借助下面提到的命令使用 numpy 为 x 和 y 创建随机数据 −

import numpy as np

x_train = np.random.random((100,4,8))
y_train = np.random.random((100,10))

现在,创建随机验证数据,

x_val = np.random.random((100,4,8))
y_val = np.random.random((100,10))

Create model

让我们创建简单的顺序模型 −

from keras.models import Sequential model = Sequential()

Add layers

创建图层以添加模型 −

from keras.layers import LSTM, Dense

# add a sequence of vectors of dimension 16
model.add(LSTM(16, return_sequences = True))
model.add(Dense(10, activation = 'softmax'))

compile model

现在模型已定义。您可以使用以下命令进行编译 −

model.compile(
   loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
)

Apply fit()

现在,我们应用 fit() 函数来训练我们的数据 −

model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))

Create a Multi-Layer Perceptron ANN

我们已经学会创建、编译和训练 Keras 模型。

让我们应用所学知识并创建一个基于 MPL 的简单神经网络。

Dataset module

在创建一个模型之前,我们需要选择一个问题,需要收集所需数据,并将数据转换为 NumPy 数组。一旦收集到数据,我们就可以准备模型并使用收集的数据对其进行训练。数据收集是机器学习中最困难的阶段之一。Keras 提供了一个特殊模块数据集,用于下载在线机器学习数据以用于训练目的。它从在线服务器获取数据,处理数据,并将数据作为训练和测试集返回。让我们检查 Keras 数据集模块提供的数据。此模块中提供的数据如下:

  1. CIFAR10 small image classification

  2. CIFAR100 small image classification

  3. IMDB 电影评论情感分类

  4. Reuters newswire topics classification

  5. 手写数字的 MNIST 数据库

  6. 时尚文章的 Fashion-MNIST 数据库

  7. 波士顿住房价格回归数据集

让我们使用 MNIST database of handwritten digits (或 minst)作为我们的输入。minst 是 60,000 个 28x28 灰度图像的集合。它包含 10 位数字。它还包含 10,000 个测试图像。

可以使用以下代码加载数据集 −

from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

其中

  1. Line 1 从 keras 数据集模块导入 minst

  2. Line 3 调用 load_data 函数,该函数将从在线服务器获取数据,并将数据作为 2 个元组返回,第一个元组 (x_train, y_train) 表示形状为 (number_sample, 28, 28) 的训练数据及其形状为 (number_samples, ) 的数字标签。第二个元组 (x_test, y_test) 表示形状相同的测试数据。

还可以使用类似的 API 获取其他数据集,每个 API 也返回类似的数据,但数据形状除外。数据的形状取决于数据类型。

Create a model

让我们选择下面表示的简单多层感知器 (MLP),并尝试使用 Keras 创建该模型。

create model

该模型的核心功能如下:

  1. 输入层由 784 个值(28 x 28 = 784)组成。

  2. 第一个隐藏层 Dense 由 512 个神经元组成,并使用“relu”激活函数。

  3. 第二个隐藏层 Dropout 的值为 0.2。

  4. 第三个隐藏层再次为 Dense,由 512 个神经元组成,并使用“relu”激活函数。

  5. 第四个隐藏层 Dropout 的值为 0.2。

  6. 第五个也是最后一个层由 10 个神经元组成,并使用“softmax”激活函数。

  7. categorical_crossentropy 用作损失函数。

  8. Use RMSprop() as Optimizer.

  9. Use accuracy as metrics.

  10. 使用 128 作为批量大小。

  11. Use 20 as epochs.

Step 1 − Import the modules

让我们导入必需的模块。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
import numpy as np

Step 2 − Load data

让我们导入 mnist 数据集。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

Step 3 − Process the data

让我们根据模型修改数据集,以便可以将其馈送至我们的模型。

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

其中

  1. reshape 用于将输入从 (28, 28) 元组重新整形为 (784, )

  2. to_categorical 用于将向量转换为二进制矩阵

Step 4 − Create the model

让我们创建实际模型。

model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation = 'relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))

Step 5 − Compile the model

让我们使用选定的损失函数、优化器和指标来编译模型。

model.compile(loss = 'categorical_crossentropy',
   optimizer = RMSprop(),
   metrics = ['accuracy'])

Step 6 − Train the model

让我们使用 fit() 方法训练模型。

history = model.fit(
   x_train, y_train,
   batch_size = 128,
   epochs = 20,
   verbose = 1,
   validation_data = (x_test, y_test)
)

Final thoughts

我们已创建该模型,加载了数据并且还将数据训练到了该模型。我们仍然需要评估模型并预测未知输入的输出,我们将在即将到来的章节中学习。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
import numpy as np

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape = (784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy',
   optimizer = RMSprop(),
   metrics = ['accuracy'])

history = model.fit(x_train, y_train,
   batch_size = 128, epochs = 20, verbose = 1, validation_data = (x_test, y_test))

执行该应用程序将给出以下内容作为输出 −

Train on 60000 samples, validate on 10000 samples Epoch 1/20
60000/60000 [==============================] - 7s 118us/step - loss: 0.2453
- acc: 0.9236 - val_loss: 0.1004 - val_acc: 0.9675 Epoch 2/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.1023
- acc: 0.9693 - val_loss: 0.0797 - val_acc: 0.9761 Epoch 3/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.0744
- acc: 0.9770 - val_loss: 0.0727 - val_acc: 0.9791 Epoch 4/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.0599
- acc: 0.9823 - val_loss: 0.0704 - val_acc: 0.9801 Epoch 5/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0504
- acc: 0.9853 - val_loss: 0.0714 - val_acc: 0.9817 Epoch 6/20
60000/60000 [==============================] - 7s 111us/step - loss: 0.0438
- acc: 0.9868 - val_loss: 0.0845 - val_acc: 0.9809 Epoch 7/20
60000/60000 [==============================] - 7s 114us/step - loss: 0.0391
- acc: 0.9887 - val_loss: 0.0823 - val_acc: 0.9802 Epoch 8/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0364
- acc: 0.9892 - val_loss: 0.0818 - val_acc: 0.9830 Epoch 9/20
60000/60000 [==============================] - 7s 113us/step - loss: 0.0308
- acc: 0.9905 - val_loss: 0.0833 - val_acc: 0.9829 Epoch 10/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0289
- acc: 0.9917 - val_loss: 0.0947 - val_acc: 0.9815 Epoch 11/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0279
- acc: 0.9921 - val_loss: 0.0818 - val_acc: 0.9831 Epoch 12/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0260
- acc: 0.9927 - val_loss: 0.0945 - val_acc: 0.9819 Epoch 13/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0257
- acc: 0.9931 - val_loss: 0.0952 - val_acc: 0.9836 Epoch 14/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0229
- acc: 0.9937 - val_loss: 0.0924 - val_acc: 0.9832 Epoch 15/20
60000/60000 [==============================] - 7s 115us/step - loss: 0.0235
- acc: 0.9937 - val_loss: 0.1004 - val_acc: 0.9823 Epoch 16/20
60000/60000 [==============================] - 7s 113us/step - loss: 0.0214
- acc: 0.9941 - val_loss: 0.0991 - val_acc: 0.9847 Epoch 17/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0219
- acc: 0.9943 - val_loss: 0.1044 - val_acc: 0.9837 Epoch 18/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0190
- acc: 0.9952 - val_loss: 0.1129 - val_acc: 0.9836 Epoch 19/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0197
- acc: 0.9953 - val_loss: 0.0981 - val_acc: 0.9841 Epoch 20/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0198
- acc: 0.9950 - val_loss: 0.1215 - val_acc: 0.9828

Keras - Model Evaluation and Model Prediction

本章介绍 Keras 中的模型评估和模型预测。

让我们从了解模型评估开始。

Model Evaluation

评估是模型开发过程中的一个过程,用于检查模型是否最适合给定的问题和对应数据。Keras 模型提供了一个函数,evaluate,它对模型进行评估。它有三个主要参数:

  1. Test data

  2. Test data label

  3. verbose - true 或 false

让我们评估在上一章中使用测试数据创建的模型。

score = model.evaluate(x_test, y_test, verbose = 0)

print('Test loss:', score[0])
print('Test accuracy:', score[1])

执行上述代码将输出以下信息。

0

测试准确率为 98.28%。我们创建了一个最佳模型来识别手写数字。从积极的一面来说,我们仍然可以改善我们的模型。

Model Prediction

Prediction 是最后一步,也是我们对模型生成的预期结果。Keras 提供了一个方法,predict,以获取训练模型的预测。predict 方法的特征如下:

predict(
   x,
   batch_size = None,
   verbose = 0,
   steps = None,
   callbacks = None,
   max_queue_size = 10,
   workers = 1,
   use_multiprocessing = False
)

此处,除了第一个参数(引用未知输入数据)以外,所有参数都是可选的。应该保持形状以获得正确的预测。

让我们使用以下代码对在上一章中创建的 MPL 模型进行预测 −

pred = model.predict(x_test)
pred = np.argmax(pred, axis = 1)[:5]
label = np.argmax(y_test,axis = 1)[:5]

print(pred)
print(label)

在此,

  1. Line 1 使用测试数据调用 predict 函数。

  2. Line 2 获取前五个预测

  3. Line 3 获取测试数据的头五个标签。

  4. Line 5 - 6 打印预测和实际标签。

上述应用程序的输出如下 −

[7 2 1 0 4]
[7 2 1 0 4]

这两个数组的输出是相同的,这表明我们的模型正确预测了前五个图像。

Keras - Convolution Neural Network

让我们将模型从 MPL 修改为 Convolution Neural Network (CNN) 以解决我们先前的数字识别问题。

CNN 可以表示如下 −

convolution neural network

该模型的核心功能如下:

  1. 输入层包含 (1, 8, 28) 值。

  2. 第一层 Conv2D 包含 32 个滤波器和“relu”激活函数,其核尺寸为 (3,3)。

  3. 第二层 Conv2D 包含 64 个滤波器和“relu”激活函数,其核尺寸为 (3,3)。

  4. 第三层 MaxPooling 拥有池尺寸 (2, 2)。

  5. 第五层 Flatten 用于将其所有输入展平为单维。

  6. 第六层 Dense 包含 128 个神经元和“relu”激活函数。

  7. 第七层 Dropout 的值为 0.5。

  8. 第八个且是最后一层包含 10 个神经元和“softmax”激活函数。

  9. categorical_crossentropy 用作损失函数。

  10. Use Adadelta() as Optimizer.

  11. Use accuracy as metrics.

  12. 使用 128 作为批量大小。

  13. Use 20 as epochs.

Step 1 − Import the modules

让我们导入必需的模块。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
import numpy as np

Step 2 − Load data

让我们导入 mnist 数据集。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

Step 3 − Process the data

让我们根据模型修改数据集,以便可以将其馈送至我们的模型。

img_rows, img_cols = 28, 28

if K.image_data_format() == 'channels_first':
   x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
   x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
   input_shape = (1, img_rows, img_cols)
else:
   x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
   x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
   input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

数据处理与 MPL 模型类似,除了输入数据形状和图像格式配置。

Step 4 − Create the model

让我们创建实际模型。

model = Sequential()
model.add(Conv2D(32, kernel_size = (3, 3),
   activation = 'relu', input_shape = input_shape))
model.add(Conv2D(64, (3, 3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Dropout(0.25)) model.add(Flatten())
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation = 'softmax'))

Step 5 − Compile the model

让我们使用选定的损失函数、优化器和指标来编译模型。

model.compile(loss = keras.losses.categorical_crossentropy,
   optimizer = keras.optimizers.Adadelta(), metrics = ['accuracy'])

Step 6 − Train the model

让我们使用 fit() 方法训练模型。

model.fit(
   x_train, y_train,
   batch_size = 128,
   epochs = 12,
   verbose = 1,
   validation_data = (x_test, y_test)
)

执行该应用程序将输出以下信息 −

Train on 60000 samples, validate on 10000 samples Epoch 1/12
60000/60000 [==============================] - 84s 1ms/step - loss: 0.2687
- acc: 0.9173 - val_loss: 0.0549 - val_acc: 0.9827 Epoch 2/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0899
- acc: 0.9737 - val_loss: 0.0452 - val_acc: 0.9845 Epoch 3/12
60000/60000 [==============================] - 83s 1ms/step - loss: 0.0666
- acc: 0.9804 - val_loss: 0.0362 - val_acc: 0.9879 Epoch 4/12
60000/60000 [==============================] - 81s 1ms/step - loss: 0.0564
- acc: 0.9830 - val_loss: 0.0336 - val_acc: 0.9890 Epoch 5/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0472
- acc: 0.9861 - val_loss: 0.0312 - val_acc: 0.9901 Epoch 6/12
60000/60000 [==============================] - 83s 1ms/step - loss: 0.0414
- acc: 0.9877 - val_loss: 0.0306 - val_acc: 0.9902 Epoch 7/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0375
-acc: 0.9883 - val_loss: 0.0281 - val_acc: 0.9906 Epoch 8/12
60000/60000 [==============================] - 91s 2ms/step - loss: 0.0339
- acc: 0.9893 - val_loss: 0.0280 - val_acc: 0.9912 Epoch 9/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0325
- acc: 0.9901 - val_loss: 0.0260 - val_acc: 0.9909 Epoch 10/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0284
- acc: 0.9910 - val_loss: 0.0250 - val_acc: 0.9919 Epoch 11/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0287
- acc: 0.9907 - val_loss: 0.0264 - val_acc: 0.9916 Epoch 12/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0265
- acc: 0.9920 - val_loss: 0.0249 - val_acc: 0.9922

Step 7 − Evaluate the model

让我们使用测试数据评估模型。

score = model.evaluate(x_test, y_test, verbose = 0)

print('Test loss:', score[0])
print('Test accuracy:', score[1])

执行以上代码将会输出以下信息−

Test loss: 0.024936060590433316
Test accuracy: 0.9922

测试准确率为 99.22%。我们已创建用于识别手写数字的最佳模型。

Step 8 − Predict

最后,从图像预测数字,如下所示 −

pred = model.predict(x_test)
pred = np.argmax(pred, axis = 1)[:5]
label = np.argmax(y_test,axis = 1)[:5]

print(pred)
print(label)

上述应用程序的输出如下 −

[7 2 1 0 4]
[7 2 1 0 4]

两个数组的输出完全相同,表明我们的模型正确预测了前五个图像。

Keras - Regression Prediction using MPL

在本章中,让我们编写一个简单的基于 MPL 的 ANN 来进行回归预测。到目前为止,我们只完成了基于分类的预测。现在,我们将尝试通过分析先前(连续)值及其影响因素来预测下一个可能的值。

回归 MPL 可以表示为以下内容:

mpl

该模型的核心功能如下:

  1. 输入层包含 (13,) 值。

  2. 第一层,致密层包含 64 个单元,“relu”激活函数,以及“正常”内核初始化器。

  3. 第二层,致密层包含 64 个单元和“relu”激活函数。

  4. 输出层,致密层包含 1 个单元。

  5. 使用 mse 作为损失函数。

  6. Use RMSprop as Optimizer.

  7. Use accuracy as metrics.

  8. 使用 128 作为批量大小。

  9. Use 500 as epochs.

Step 1 − Import the modules

让我们导入必需的模块。

import keras

from keras.datasets import boston_housing
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import RMSprop
from keras.callbacks import EarlyStopping
from sklearn import preprocessing
from sklearn.preprocessing import scale

Step 2 − Load data

让我们导入 Boston 住房数据集。

(x_train, y_train), (x_test, y_test) = boston_housing.load_data()

在此,

boston_housing 是由Keras提供的用于数据集。它表示波士顿地区房价信息的一个集合,其中每条信息有13个特性。

Step 3 − Process the data

让我们根据我们的模型改变数据集,以便我们可以将它送入我们的模型。可以使用以下代码来改变数据−

x_train_scaled = preprocessing.scale(x_train)
scaler = preprocessing.StandardScaler().fit(x_train)
x_test_scaled = scaler.transform(x_test)

在这里,我们已经使用 sklearn.preprocessing.scale 函数来规范化训练数据。 preprocessing.StandardScaler().fit 函数返回一个带有训练数据规范化均值和标准偏差的标量,我们可以使用 scalar.transform 函数将其应用于测试数据。这样会使用和训练数据中一样的设定来规范化测试数据。

Step 4 − Create the model

让我们创建实际模型。

model = Sequential()
model.add(Dense(64, kernel_initializer = 'normal', activation = 'relu',
input_shape = (13,)))
model.add(Dense(64, activation = 'relu')) model.add(Dense(1))

Step 5 − Compile the model

让我们使用选定的损失函数、优化器和指标来编译模型。

model.compile(
   loss = 'mse',
   optimizer = RMSprop(),
   metrics = ['mean_absolute_error']
)

Step 6 − Train the model

让我们使用 fit() 方法训练模型。

history = model.fit(
   x_train_scaled, y_train,
   batch_size=128,
   epochs = 500,
   verbose = 1,
   validation_split = 0.2,
   callbacks = [EarlyStopping(monitor = 'val_loss', patience = 20)]
)

在这里,我们使用了回调函数 EarlyStopping 。此回调函数的目的是监控每个时期中的损失值,并将其与前一个时期中的损失值进行对比,以寻找训练中的改进。如果 patience 次都没有改进,则会停止整个进程。

执行应用程序将给出如下的信息作为输出−

Train on 323 samples, validate on 81 samples Epoch 1/500 2019-09-24 01:07:03.889046: I
tensorflow/core/platform/cpu_feature_guard.cc:142]
Your CPU supports instructions that this
TensorFlow binary was not co mpiled to use: AVX2 323/323
[==============================] - 0s 515us/step - loss: 562.3129
- mean_absolute_error: 21.8575 - val_loss: 621.6523 - val_mean_absolute_erro
r: 23.1730 Epoch 2/500
323/323 [==============================] - 0s 11us/step - loss: 545.1666
- mean_absolute_error: 21.4887 - val_loss: 605.1341 - val_mean_absolute_error
: 22.8293 Epoch 3/500
323/323 [==============================] - 0s 12us/step - loss: 528.9944
- mean_absolute_error: 21.1328 - val_loss: 588.6594 - val_mean_absolute_error
: 22.4799 Epoch 4/500
323/323 [==============================] - 0s 12us/step - loss: 512.2739
- mean_absolute_error: 20.7658 - val_loss: 570.3772 - val_mean_absolute_error
: 22.0853 Epoch 5/500
323/323 [==============================] - 0s 9us/step - loss: 493.9775
- mean_absolute_error: 20.3506 - val_loss: 550.9548 - val_mean_absolute_error: 21.6547
..........
..........
..........
Epoch 143/500
323/323 [==============================] - 0s 15us/step - loss: 8.1004
- mean_absolute_error: 2.0002 - val_loss: 14.6286 - val_mean_absolute_error:
2. 5904 Epoch 144/500
323/323 [==============================] - 0s 19us/step - loss: 8.0300
- mean_absolute_error: 1.9683 - val_loss: 14.5949 - val_mean_absolute_error:
2. 5843 Epoch 145/500
323/323 [==============================] - 0s 12us/step - loss: 7.8704
- mean_absolute_error: 1.9313 - val_loss: 14.3770 - val_mean_absolute_error: 2. 4996

Step 7 − Evaluate the model

让我们使用测试数据评估模型。

score = model.evaluate(x_test_scaled, y_test, verbose = 0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

执行以上代码将会输出以下信息−

Test loss: 21.928471583946077 Test accuracy: 2.9599233234629914

Step 7 − Evaluate the model

让我们使用测试数据评估模型。

score = model.evaluate(x_test_scaled, y_test, verbose = 0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

执行以上代码将会输出以下信息−

Test loss: 21.928471583946077
Test accuracy: 2.9599233234629914

Step 8 − Predict

最后,如下预测使用测试数据−

prediction = model.predict(x_test_scaled)
print(prediction.flatten())
print(y_test)

上述应用程序的输出如下 −

[ 7.5612316 17.583357 21.09344 31.859276 25.055613 18.673872 26.600405 22.403967 19.060272 22.264952
17.4191 17.00466 15.58924 41.624374 20.220217 18.985565 26.419338 19.837091 19.946192 36.43445
12.278508 16.330965 20.701359 14.345301 21.741161 25.050423 31.046402 27.738455 9.959419 20.93039
20.069063 14.518344 33.20235 24.735163 18.7274 9.148898 15.781284 18.556862 18.692865 26.045074
27.954073 28.106823 15.272034 40.879818 29.33896 23.714525 26.427515 16.483374 22.518442 22.425386
33.94826 18.831465 13.2501955 15.537227 34.639984 27.468002 13.474407 48.134598 34.39617
22.8503124.042334 17.747198 14.7837715 18.187277 23.655672 22.364983 13.858193 22.710032 14.371148
7.1272087 35.960033 28.247292 25.3014 14.477208 25.306196 17.891165 20.193708 23.585173 34.690193
12.200583 20.102983 38.45882 14.741723 14.408362 17.67158 18.418497 21.151712 21.157492 22.693687
29.809034 19.366991 20.072294 25.880817 40.814568 34.64087 19.43741 36.2591 50.73806 26.968863 43.91787
32.54908 20.248306 ] [ 7.2 18.8 19. 27. 22.2 24.5 31.2 22.9 20.5 23.2 18.6 14.5 17.8 50. 20.8 24.3 24.2
19.8 19.1 22.7 12. 10.2 20. 18.5 20.9 23. 27.5 30.1 9.5 22. 21.2 14.1 33.1 23.4 20.1 7.4 15.4 23.8 20.1
24.5 33. 28.4 14.1 46.7 32.5 29.6 28.4 19.8 20.2 25. 35.4 20.3 9.7 14.5 34.9 26.6 7.2 50. 32.4 21.6 29.8
13.1 27.5 21.2 23.1 21.9 13. 23.2 8.1 5.6 21.7 29.6 19.6 7. 26.4 18.9 20.9 28.1 35.4 10.2 24.3 43.1 17.6
15.4 16.2 27.1 21.4 21.5 22.4 25. 16.6 18.6 22. 42.8 35.1 21.5 36. 21.9 24.1 50. 26.7 25. ]

两个数组的输出大约有10-30%的差异,这表示我们的模型预测在合理范围内。

Keras - Time Series Prediction using LSTM RNN

在本章中,我们将编写一个基于简单长短期记忆 (LSTM) 的 RNN 来执行序列分析。序列是一组值,其中每个值对应于时间的一个特定实例。我们考虑一个简单的阅读句子示例。阅读理解一个句子包括按给定顺序阅读单词并尝试理解给定语境中的每个单词及其含义,最后以积极或消极的情感理解句子。

在此处,单词被视为值,并且第一个值对应于第一个单词,第二个值对应于第二个单词,等等,并严格保持顺序。 Sequence Analysis 在自然语言处理中经常用于寻找给定文本的情感分析。

让我们创建一个 LSTM 模型来分析 IMDB 电影评论并找出其正面/负面情绪。

用于序列分析的模型可以表示为以下内容 −

sequence analysis

该模型的核心功能如下:

  1. 输入层使用具有 128 个特征的嵌入层。

  2. 第一层,Dense 由 128 个单元组成,具有法线置零和循环置零,设置为 0.2。

  3. 输出层,Dense 由 1 个单元和“sigmoid”激活函数组成。

  4. 使用 binary_crossentropy 作为损失函数。

  5. Use adam as Optimizer.

  6. Use accuracy as metrics.

  7. 使用 32 作为批量大小。

  8. Use 15 as epochs.

  9. 使用 80 作为单词的最大长度。

  10. 使用 2000 作为给定句子中单词的最大数量。

Step 1: Import the modules

让我们导入必需的模块。

from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Embedding
from keras.layers import LSTM
from keras.datasets import imdb

Step 2: Load data

我们导入 imdb 数据集。

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words = 2000)

在此,

  1. imdb 是 Keras 提供的数据集。它表示一系列电影及其评论。

  2. num_words 表示评论中的最大单词数。

Step 3: Process the data

让我们根据模型更改数据集,以便可以将其输入到模型中。可以使用以下代码更改数据 −

x_train = sequence.pad_sequences(x_train, maxlen=80)
x_test = sequence.pad_sequences(x_test, maxlen=80)

在此,

sequence.pad_sequences 将形状为 (data) 的输入数据列表转换为形状为 (data, timesteps) 的 2D NumPy 数组。它基本上将时间步概念添加到给定数据中。它生成长度为 maxlen 的时间步。

Step 4: Create the model

让我们创建实际模型。

model = Sequential()
model.add(Embedding(2000, 128))
model.add(LSTM(128, dropout = 0.2, recurrent_dropout = 0.2))
model.add(Dense(1, activation = 'sigmoid'))

在此,

我们使用 Embedding layer 作为输入层,然后添加 LSTM 层。最后,使用 Dense layer 作为输出层。

Step 5: Compile the model

让我们使用选定的损失函数、优化器和指标来编译模型。

model.compile(loss = 'binary_crossentropy',
   optimizer = 'adam', metrics = ['accuracy'])

Step 6: Train the model

让我们使用 fit() 方法训练模型。

model.fit(
   x_train, y_train,
   batch_size = 32,
   epochs = 15,
   validation_data = (x_test, y_test)
)

执行该应用程序将输出以下信息 −

Epoch 1/15 2019-09-24 01:19:01.151247: I
tensorflow/core/platform/cpu_feature_guard.cc:142]
Your CPU supports instructions that this
TensorFlow binary was not co mpiled to use: AVX2
25000/25000 [==============================] - 101s 4ms/step - loss: 0.4707
- acc: 0.7716 - val_loss: 0.3769 - val_acc: 0.8349 Epoch 2/15
25000/25000 [==============================] - 95s 4ms/step - loss: 0.3058
- acc: 0.8756 - val_loss: 0.3763 - val_acc: 0.8350 Epoch 3/15
25000/25000 [==============================] - 91s 4ms/step - loss: 0.2100
- acc: 0.9178 - val_loss: 0.5065 - val_acc: 0.8110 Epoch 4/15
25000/25000 [==============================] - 90s 4ms/step - loss: 0.1394
- acc: 0.9495 - val_loss: 0.6046 - val_acc: 0.8146 Epoch 5/15
25000/25000 [==============================] - 90s 4ms/step - loss: 0.0973
- acc: 0.9652 - val_loss: 0.5969 - val_acc: 0.8147 Epoch 6/15
25000/25000 [==============================] - 98s 4ms/step - loss: 0.0759
- acc: 0.9730 - val_loss: 0.6368 - val_acc: 0.8208 Epoch 7/15
25000/25000 [==============================] - 95s 4ms/step - loss: 0.0578
- acc: 0.9811 - val_loss: 0.6657 - val_acc: 0.8184 Epoch 8/15
25000/25000 [==============================] - 97s 4ms/step - loss: 0.0448
- acc: 0.9850 - val_loss: 0.7452 - val_acc: 0.8136 Epoch 9/15
25000/25000 [==============================] - 95s 4ms/step - loss: 0.0324
- acc: 0.9894 - val_loss: 0.7616 - val_acc: 0.8162Epoch 10/15
25000/25000 [==============================] - 100s 4ms/step - loss: 0.0247
- acc: 0.9922 - val_loss: 0.9654 - val_acc: 0.8148 Epoch 11/15
25000/25000 [==============================] - 99s 4ms/step - loss: 0.0169
- acc: 0.9946 - val_loss: 1.0013 - val_acc: 0.8104 Epoch 12/15
25000/25000 [==============================] - 90s 4ms/step - loss: 0.0154
- acc: 0.9948 - val_loss: 1.0316 - val_acc: 0.8100 Epoch 13/15
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0113
- acc: 0.9963 - val_loss: 1.1138 - val_acc: 0.8108 Epoch 14/15
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0106
- acc: 0.9971 - val_loss: 1.0538 - val_acc: 0.8102 Epoch 15/15
25000/25000 [==============================] - 89s 4ms/step - loss: 0.0090
- acc: 0.9972 - val_loss: 1.1453 - val_acc: 0.8129
25000/25000 [==============================] - 10s 390us/step

Step 7 − Evaluate the model

让我们使用测试数据评估模型。

score, acc = model.evaluate(x_test, y_test, batch_size = 32)

print('Test score:', score)
print('Test accuracy:', acc)

执行以上代码将会输出以下信息−

Test score: 1.145306069601178
Test accuracy: 0.81292

Keras - Applications

Keras 应用程序模块用于为深度神经网络提供预训练模型。Keras 模型用于预测、特征提取和微调。本章详细解释了 Keras 应用程序。

Pre-trained models

训练好的模型由两个部分组成,模型架构和模型权重。模型权重是大型文件,因此我们必须从 ImageNet 数据库下载和提取特征。下面列出了一些流行的预训练模型:

  1. ResNet

  2. VGG16

  3. MobileNet

  4. InceptionResNetV2

  5. InceptionV3

Loading a model

Keras 预训练模型可以轻松加载,如下所示:

import keras
import numpy as np

from keras.applications import vgg16, inception_v3, resnet50, mobilenet

#Load the VGG model
vgg_model = vgg16.VGG16(weights = 'imagenet')

#Load the Inception_V3 model
inception_model = inception_v3.InceptionV3(weights = 'imagenet')

#Load the ResNet50 model
resnet_model = resnet50.ResNet50(weights = 'imagenet')

#Load the MobileNet model mobilenet_model = mobilenet.MobileNet(weights = 'imagenet')

一旦加载了该模型,我们就可以立即将其用于预测目的。让我们在即将到来的章节中查看每个预训练模型。

Real Time Prediction using ResNet Model

ResNet 是一个预训练模型,它使用 ImageNet 进行了训练。在 ImageNet 上预训练了 ResNet 模型权重。它的语法如下所示:

keras.applications.resnet.ResNet50 (
   include_top = True,
   weights = 'imagenet',
   input_tensor = None,
   input_shape = None,
   pooling = None,
   classes = 1000
)

在此,

  1. include_top 指网络顶部的全连接层。

  2. weights 指在 ImageNet 上的预训练。

  3. input_tensor 指用于作为模型图像输入的可选 Keras 张量。

  4. input_shape 指可选形状元组。该模型的默认输入大小为 224x224。

  5. classes 指对图像进行分类的可选类别数。

让我们通过写一个简单的示例来了解该模型:

Step 1: import the modules

让我们加载必要的模块,如下所示:

>>> import PIL
>>> from keras.preprocessing.image import load_img
>>> from keras.preprocessing.image import img_to_array
>>> from keras.applications.imagenet_utils import decode_predictions
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> from keras.applications.resnet50 import ResNet50
>>> from keras.applications import resnet50

Step 2: Select an input

让我们选择一个输入图像, Lotus 如下所示:

>>> filename = 'banana.jpg'
>>> ## load an image in PIL format
>>> original = load_img(filename, target_size = (224, 224))
>>> print('PIL image size',original.size)
PIL image size (224, 224)
>>> plt.imshow(original)
<matplotlib.image.AxesImage object at 0x1304756d8>
>>> plt.show()

在这里,我们加载了一张图像 (banana.jpg) 并显示了它。

Step 3: Convert images into NumPy array

让我们将我们的输入 Banana 转换成 NumPy 数组,以便将其传递到模型中以进行预测。

>>> #convert the PIL image to a numpy array
>>> numpy_image = img_to_array(original)

>>> plt.imshow(np.uint8(numpy_image))
<matplotlib.image.AxesImage object at 0x130475ac8>

>>> print('numpy array size',numpy_image.shape)
numpy array size (224, 224, 3)

>>> # Convert the image / images into batch format
>>> image_batch = np.expand_dims(numpy_image, axis = 0)

>>> print('image batch size', image_batch.shape)
image batch size (1, 224, 224, 3)
>>>

Step 4: Model prediction

让我们将我们的输入输入模型以获取预测

>>> prepare the image for the resnet50 model >>>
>>> processed_image = resnet50.preprocess_input(image_batch.copy())

>>> # create resnet model
>>>resnet_model = resnet50.ResNet50(weights = 'imagenet')
>>> Downloavding data from https://github.com/fchollet/deep-learning-models/releas
es/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels.h5
102858752/102853048 [==============================] - 33s 0us/step

>>> # get the predicted probabilities for each class
>>> predictions = resnet_model.predict(processed_image)

>>> # convert the probabilities to class labels
>>> label = decode_predictions(predictions)
Downloading data from https://storage.googleapis.com/download.tensorflow.org/
data/imagenet_class_index.json
40960/35363 [==================================] - 0s 0us/step

>>> print(label)

Output

[
   [
      ('n07753592', 'banana', 0.99229723),
      ('n03532672', 'hook', 0.0014551596),
      ('n03970156', 'plunger', 0.0010738898),
      ('n07753113', 'fig', 0.0009359837) ,
      ('n03109150', 'corkscrew', 0.00028538404)
   ]
]

在这里,该模型正确地预测了香蕉图像。

Keras - Pre-Trained Models

在本章中,我们将学习 Keras 中的预训练模型。让我们从 VGG16 开始。

VGG16

VGG16 是另一个预训练模型。它也是使用 ImageNet 训练的。加载模型的语法如下:

keras.applications.vgg16.VGG16(
   include_top = True,
   weights = 'imagenet',
   input_tensor = None,
   input_shape = None,
   pooling = None,
   classes = 1000
)

该模型的默认输入大小为 224x224。

MobileNetV2

MobileNetV2 是另一个预训练模型。它也是使用 ImageNet 训练的。

加载模型的语法如下:

keras.applications.mobilenet_v2.MobileNetV2 (
   input_shape = None,
   alpha = 1.0,
   include_top = True,
   weights = 'imagenet',
   input_tensor = None,
   pooling = None,
   classes = 1000
)

在此,

alpha 控制网络的宽度。如果值低于 1,则减少每一层中的滤波器数量。如果值高于 1,则增加每一层中的滤波器数量。如果 alpha = 1,则每一层都使用来自论文的默认滤波器数量。

该模型的默认输入大小为 224x224

InceptionResNetV2

InceptionResNetV2 是另一个预训练模型。它也是使用 ImageNet 训练的。加载模型的语法如下:

keras.applications.inception_resnet_v2.InceptionResNetV2 (
   include_top = True,
   weights = 'imagenet',
   input_tensor = None,
   input_shape = None,
   pooling = None,
   classes = 1000)

此模型可以采用“channels_first”数据格式(通道数、高度、宽度)或“channels_last”数据格式(高度、宽度、通道数)构建。

此模型的默认输入大小为 299x299

InceptionV3

InceptionV3 是另一个预训练模型。它也是使用 ImageNet 训练的。加载模型的语法如下所示 −

keras.applications.inception_v3.InceptionV3 (
   include_top = True,
   weights = 'imagenet',
   input_tensor = None,
   input_shape = None,
   pooling = None,
   classes = 1000
)

在此,

此模型的默认输入大小为 299x299

Conclusion

Keras 是非常简单、可扩展且易于实现的神经网络 API,可用于构建具有高级抽象的高级学习应用程序。Keras 是深度学习模型的最佳选择。