Keras 简明教程
Keras - Introduction Deep learning is one of the major subfield of machine learning framework. Machine learning is the study of design of algorithms, inspired from the model of human brain. Deep learning is becoming more popular in data science fields like robotics, artificial intelligence(AI), audio & video recognition and image recognition. Artificial neural network is the core of deep learning methodologies. Deep learning is supported by various libraries such as Theano, TensorFlow, Caffe, Mxnet etc., Keras is one of the most powerful and easy to use python library, which is built on top of popular deep learning libraries like TensorFlow, Theano, etc., for creating deep learning models.
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 是深度学习应用程序的最佳选择。
Keras - Installation
本章介绍了如何在机器上安装 Keras。在进入安装之前,让我们了解 Keras 的基本要求。
Prerequisites
您必须满足以下要求 −
-
任何操作系统(Windows、Linux 或 Mac)
-
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 库。
-
Numpy
-
Pandas
-
Scikit-learn
-
Matplotlib
-
Scipy
-
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
它是一个开源机器学习库。它用于分类、回归和聚类算法。在进行安装之前,它需要以下内容 -
-
Python 版本 3.5 或更高
-
NumPy 版本 1.11.0 或更高
-
SciPy 版本 0.17.0 或更高
-
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
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 说明。
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"
}
在此,
-
image_data_format 代表数据格式。
-
epsilon 代表数字常量。它用于避免 DivideByZero 错误。
-
float*x represent the default data type *float32 。你也可以使用 set_floatx() 方法将其更改为 float16 或 float64 。
-
image_data_format 代表数据格式。
假设如果没有创建这个文件,那么就移动到相应位置,然后使用以下步骤创建:
> cd home
> mkdir .keras
> vi keras.json
记住,你应该将其文件夹名称指定为 .keras,并在 keras.json 文件中添加以上配置。我们可以执行一些预定义的操作以了解后端函数。
Keras - Overview of Deep learning
深度学习是机器学习的一个不断发展中的子领域。深度学习涉及对输入进行逐层分析,每一层逐渐提取关于输入的高级信息。
让我们分析一张图像,以作为一种简单的情景。让我们假设你的输入图像被分成一个矩形的像素网格。现在,第一层对像素进行抽象。第二层理解图像中的边缘。下一层从边缘构建节点。然后,下一层将从节点中找到分支。最后,输出层将检测整个对象。在这里,特征提取过程从一层输出进入下一层输入。
通过使用这种方法,我们可以处理大量的特征,这使得深度学习成为一个非常强大的工具。深度学习算法也适用于非结构化数据分析。让我们在本章中学习深度学习的基础知识。
Artificial Neural Networks
深度学习最流行和最主要的方法是使用“人工神经网络”(ANN)。它们受到人类大脑模型的启发,而大脑是我们身体最复杂的器官。人脑由超过 900 亿个称为“神经元”的微小细胞组成。神经元通过称为“轴突”和“树突”的神经纤维相互连接。轴突的主要作用是将信息从一个神经元传送到另一个神经元,也就是与它相连的神经元。
类似地,树突的主要作用是接收与之相连的另一个神经元的轴突所传输的信息。每个神经元处理少量信息,然后将结果传递给另一个神经元,这个过程不断进行。这就是我们人类大脑处理大量信息(如语言、视觉等)并从中提取有用信息的基本方法。
基于这个模型,第一个人工神经网络(ANN)是由心理学家 Frank Rosenblatt 于 1958 年发明的。ANN 由多个节点组成,类似于神经元。节点紧密相连,并组织成不同的隐藏层。输入层接收输入数据,数据依次经过一个或多个隐藏层,最后输出层预测一些关于输入数据的有用信息。例如,输入可能是一幅图像,而输出可能是图像中识别的物体,比如“猫”。
一个单神经元(在 ANN 中被称为感知器)可以表示为以下形式:
在此,
-
多个输入连同权重一起代表树突。
-
输入总和和激活函数表示神经元。 Sum 实际上表示所有输入和激活函数的计算值,表示将 Sum 值修改为 0、1 或 0 到 1 的函数。
-
实际输出表示轴突,输出将由下一层中的神经元接收。
让我们在此部分了解不同类型的人工神经网络。
Multi-Layer Perceptron
多层感知器是 ANN 最简单的形式。它由一个输入层、一个或多个隐藏层以及最终一个输出层组成。一层由感知器的集合组成。输入层基本上是输入数据的一个或多个特征。每个隐藏层都包含一个或多个神经元,处理特征的某些方面并将其处理后的信息发送到下一个隐藏层。输出层处理从最后一个隐藏层接收数据并最终输出结果。
Convolutional Neural Network (CNN)
卷积神经网络是其中一项最流行的 ANN。它广泛应用于图像和视频识别领域。它基于卷积的概念,这是一个数学概念。它几乎与多层感知器相似,只不过在完全连接的隐藏神经元层之前包含一系列卷积层和池化层。它有三个重要层数 −
-
Convolution layer − 它是主要的构建模块,基于卷积功能执行计算任务。
-
Pooling layer − 它布置在卷积层旁边,用于通过去除不需要的信息来减小输入的尺寸,从而可以更快地执行计算。
-
Fully connected layer − 它布置在卷积和池化层系列的旁边,将输入分门别类。
一个简单的 CNN 可以表示如下 −
在此,
-
使用了 2 系列卷积和池化层,它接收和处理输入(例如图像)。
-
使用了一个完全连接层,它用于输出数据(例如图像分类)。
Recurrent Neural Network (RNN)
循环神经网络 (RNN) 对于解决其他 ANN 模型中的缺陷很有用。好,大多数 ANN 不会记住以前情况的步骤,而是学习根据训练中的上下文做出决策。与此同时,RNN 存储过去的信息,其所有决策都是基于从过去学到的内容做出的。
此方法主要用于图像分类。有时,我们可能需要展望未来才能解决过去。在这种情况下,双向 RNN 有助于从过去学习并预测未来。例如,我们有来自多个输入的手写样本。假设我们对一个输入感到困惑,那么我们需要再次检查其他输入,以识别出从过去做出决定的正确上下文。
Workflow of ANN
让我们先了解深度学习的不同阶段,然后了解 Keras 如何帮助深度学习过程。
Choose an algorithm (model)
选择最适合学习过程类型(例如图像分类、文本处理等)和可用输入数据的算法。算法由 Keras 中的 Model 表示。算法包括一个或多个图层。ANN 中的每一层都可以在 Keras 中由 Keras Layer 表示。
-
Prepare data − 只处理、过滤和选择来自数据所需的信息。
-
Split data − 将数据拆分为训练集和测试数据集。测试数据将用于评估算法/模型的预测(一旦机器学习)并交叉检查学习过程的效率。
-
Compile the model - 编译算法/模型,以便进一步用于训练学习,并最终用于预测。此步骤要求我们选择损失函数和优化器。损失函数和优化器用于学习阶段,以找到错误(与实际输出的偏差)并进行优化,以便将错误最小化。
-
Fit the model - 将使用训练数据集在此阶段完成实际学习过程。
-
Predict result for unknown value - 预测未知输入数据(除现有的训练和测试数据外)的输出
-
Evaluate model - 通过预测测试数据的输出,交叉比较预测值与测试数据的实际结果,来评估模型。
-
Freeze, Modify or choose new algorithm - 检查模型评估是否成功。如果是,则保存算法以用于未来的预测。如果不是,则修改或选择新的算法/模型,最后,再次训练、预测和评估模型。重复该过程,直至找到最佳算法(模型)。
上面的步骤可以使用以下流程图表示 -
Keras - Deep learning
Keras 提供了一个完整的框架来创建任何类型的卷积神经网络。Keras 具有创新性,并且非常易于学习。它支持从简单神经网络到非常大和复杂的神经网络模型。在本章中,让我们了解 Keras 框架的架构以及 Keras 如何帮助进行深度学习。
Architecture of Keras
Keras API 可分为三大类 -
-
Model
-
Layer
-
Core Modules
在 Keras 中,每个 ANN 都由 Keras Models 表示。反过来,每个 Keras 模型都是 Keras Layers 的组成,并表示 ANN 层,如输入、隐藏层、输出层、卷积层、池化层等,Keras 模型和层访问 Keras modules 以获取激活函数、损失函数、正则化函数等。使用 Keras 模型、Keras 层和 Keras 模块,任何 ANN 算法(CNN、RNN 等)都可以用简单有效的方式表示。
下图描述了模型、层和核心模块之间的关系 -
让我们来看一下 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,)))
其中,
-
Line 1 从 Keras 模型导入 Sequential 模型
-
Line 2 导入 Dense 层和 Activation 模块
-
Line 4 使用 Sequential API 创建一个新的顺序模型
-
Line 5 添加一个具有 relu 激活(使用激活模块)功能的密集层(密集 API)。
Sequential 模型公开 Model 类以创建自定义模型。我们可以使用子类化概念来创建我们自己的复杂模型。
Functional API − Functional API 基本上可用于创建复杂模型。
Layer
Keras 模型中的每个 Keras 层代表实际提议的神经网络模型中的相应层(输入层、隐藏层和输出层)。Keras 提供了许多预构建的层,以便轻松创建任何复杂的神经网络。以下是其中一些重要的 Keras 层:
-
Core Layers
-
Convolution Layers
-
Pooling Layers
-
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'))
其中,
-
Line 1 从 Keras 模型导入 Sequential 模型
-
Line 2 导入 Dense 层和 Activation 模块
-
Line 4 使用 Sequential API 创建一个新的顺序模型
-
Line 5 添加一个具有 relu 激活(使用激活模块)功能的密集层(密集 API)。
-
Line 6 添加一个 dropout 层(Dropout API)来处理过拟合。
-
Line 7 添加另一个密集层(Dense API),激活功能为 relu (使用 Activation 模块)。
-
Line 8 添加另一个 dropout 层(Dropout API)来处理过拟合。
-
Line 9 添加最终的密集层(Dense API),激活功能为 softmax (使用 Activation 模块)。
Keras 还提供创建我们自己的自定义层。可以通过对 Keras.Layer 类进行子分类来创建自定义层,它类似于对 Keras 模型进行子分类。
Keras - Modules
正如我们先前了解的,Keras 模块包含预定义的类、函数和变量,它们对深度学习算法非常有用。让我们在本节中了解 Keras 提供的模块。
Available modules
让我们首先查看 Keras 中可用模块的列表。
-
Initializers − 提供初始化器函数的列表。我们可以在 Keras 层章节中详细了解它。在机器学习的模型创建阶段。
-
Regularizers − 提供正则化器函数的列表。我们可以在 Keras 层章节中详细了解它。
-
Constraints − 提供约束函数的列表。我们可以在 Keras 层章节中详细了解它。
-
Activations − 提供激活函数列表。我们可以在 Keras 层章节中详细了解它。
-
Losses − 提供损失函数列表。我们可以在模型训练章节中详细了解它。
-
Metrics − 提供度量函数列表。我们可以在模型训练章节中详细了解它。
-
Optimizers − 提供优化器函数列表。我们可以在模型训练章节中详细了解它。
-
Callback − 提供回调函数列表。我们可以在训练过程中使用它来打印中间数据,并根据某些条件停止训练本身( EarlyStopping 方法)。
-
Text processing − 提供将文本转换为适合机器学习的 NumPy 数组的函数。我们可以在机器学习的数据准备阶段使用它。
-
Image processing − 提供将图像转换为适合机器学习的 NumPy 数组的函数。我们可以在机器学习的数据准备阶段使用它。
-
Sequence processing − 提供从给定输入数据生成基于时间的函数数据。我们可以在机器学习的数据准备阶段使用它。
-
Backend − 提供后台库函数,如 TensorFlow 和 Theano。
-
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'
让我们简要了解一些用于数据分析的重要后台函数 −
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)
在此,
-
shape - 以元组形式表示行和列。
-
mean - 均匀分布的均值。
-
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]])
Keras - Layers
正如前面所学,Keras 层是 Keras 模型的主要构建块。每一层接收输入信息,进行一些计算,最后输出转换后的信息。一层输出将流入下一层作为其输入。让我们在此章节中了解有关层的完整详细信息。
Introduction
一个 Keras 层需要 shape of the input (input_shape) 以便了解输入数据的结构,需要 initializer 设置每个输入的权重,最后需要激活器将输出转化为非线性。中间用约束限制输入数据权重的生成范围,而正则化函数会通过在优化过程中动态地对权重施加惩罚,来尝试优化层(以及模型)。
总而言之,Keras 层需要以下最低细节信息才能创建一个完整的层。
-
输入数据形状
-
层中的神经元/单元数
-
Initializers
-
Regularizers
-
Constraints
-
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))
其中,
-
Line 1-5 导入必要的模块。
-
Line 7 使用顺序 API 创建一个新模型。
-
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。
-
Line 10 使用 16 个单元创建第二个 Dense 层,并将 relu 设置为激活函数。
-
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))
其中,
-
mean 表示要生成的随机数值的均值
-
stddev 表示要生成的随机数值的标准差
-
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))
其中,
-
minval 表示要生成的随机数值的下限
-
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))
其中,
-
scale 表示缩放因子
-
mode 表示 fan_in, fan_out 和 fan_avg 中的任何一个数值
-
distribution 表示 normal 或 uniform 中的任何一个数值
VarianceScaling
它使用以下公式查找正态分布的 stddev ,然后再使用正态分布查找权重,
stddev = sqrt(scale / n)
n 表示,
-
模式的输入单元数量 = fan_in
-
模式的输出单元数量 = fan_out
-
模式的平均输入和输出单元数量 = 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)
其中,
-
fan_in 表示输入单元的数量
-
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))
其中,
-
fan_in 表示输入单元的数量
-
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))
其中,
-
fan_in 表示输入单元的数量。
-
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 是矩阵的乘法因子。
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))
其中,
-
max_value 表示上限
-
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
在此,
-
backend 用于访问 dot 函数。
-
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)
在此,
-
Line 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)
在此,
-
Line 1 使用一个参数 input_shape 定义 build 方法。输入数据的形状由 input_shape 引用。
-
Line 2 创建与输入形状相对应的权重,并将其设置在 kernel 中。这是我们层的自定义功能。它使用“正态”初始化器创建权重。
-
Line 6 调用基础类 build 方法。
Step 5: Implement call method
call 方法在训练过程中执行层的精确工作。
我们的自定义 call 方法如下
def call(self, input_data):
return K.dot(input_data, self.kernel)
在此,
-
Line 1 用一个参数 input_data 定义 call 方法。input_data 是我们层的输入数据。
-
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)
在此,
-
Line 1 为 compute_output_shape 方法定义了一个参数 input_shape
-
Line 2 在初始化层的同时,使用输入数据的形状和输出维度设置来计算输出形状。
实现 build, call 和 compute_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()
在此,
-
我们的 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 提供了几种方法来获取模型信息,例如层、输入数据和输出数据。它们如下所示 −
-
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>
]
-
model.inputs − 以列表形式返回模型的所有输入张量。
>>> inputs = model.inputs
>>> inputs
[<tf.Tensor 'dense_13_input:0' shape=(?, 8) dtype=float32>]
-
model.outputs − 以列表形式返回模型的所有输出张量。
>>> outputs = model.outputs
>>> outputs
<tf.Tensor 'dense_15/BiasAdd:0' shape=(?, 8) dtype=float32>]
-
model.get_weights − 以 NumPy 数组形式返回所有权重。
-
model.set_weights(weight_numpy_array) − 设置模型的权重。
Serialize the model
Keras 提供了一些方法,将模型序列化为对象以及 json,并稍后重新加载它。它们如下所示 −
-
get_config() − 以对象形式返回模型。
config = model.get_config()
-
from_config() − 它接受模型配置对象作为参数,并相应地创建模型。
new_model = Sequential.from_config(config)
-
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"}'
>>>
-
用json表示接受模型并创建一个新模型。
from keras.models import model_from_json
new_model = model_from_json(json_string)
-
返回模型作为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'
>>>
-
接受模型的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
_________________________________________________________________
>>>
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 模块中提供了很多损失函数,如下所示:
-
mean_squared_error
-
mean_absolute_error
-
mean_absolute_percentage_error
-
mean_squared_logarithmic_error
-
squared_hinge
-
hinge
-
categorical_hinge
-
logcosh
-
huber_loss
-
categorical_crossentropy
-
sparse_categorical_crossentropy
-
binary_crossentropy
-
kullback_leibler_divergence
-
poisson
-
cosine_proximity
-
is_categorical_crossentropy
所有以上损失函数接受两个参数:
-
y_true − 真实标签作为张量
-
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 ,如下所示:
-
accuracy
-
binary_accuracy
-
categorical_accuracy
-
sparse_categorical_accuracy
-
top_k_categorical_accuracy
-
sparse_top_k_categorical_accuracy
-
cosine_proximity
-
clone_metric
同损失函数类似,指标也接受以下两个参数 −
-
y_true − 真实标签作为张量
-
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
)
重要参数如下 −
-
loss function
-
Optimizer
-
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])
其中,
-
损失函数设置为 mean_squared_error
-
优化器设置为 sgd
-
指标设置为 metrics.categorical_accuracy
Model Training
模型通过 fit() 使用 NumPy 数组进行训练。此拟合函数的主要目的是根据训练评估您的模型。它还可以用于绘制模型性能。它具有以下语法 −
model.fit(X, y, epochs = , batch_size = )
在此,
-
X, y − 它是一个元组,用于评估您的数据。
-
epochs − 在培训期间需要对模型进行评估的次数。
-
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))
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'))
Create a Multi-Layer Perceptron ANN
我们已经学会创建、编译和训练 Keras 模型。
让我们应用所学知识并创建一个基于 MPL 的简单神经网络。
Dataset module
在创建一个模型之前,我们需要选择一个问题,需要收集所需数据,并将数据转换为 NumPy 数组。一旦收集到数据,我们就可以准备模型并使用收集的数据对其进行训练。数据收集是机器学习中最困难的阶段之一。Keras 提供了一个特殊模块数据集,用于下载在线机器学习数据以用于训练目的。它从在线服务器获取数据,处理数据,并将数据作为训练和测试集返回。让我们检查 Keras 数据集模块提供的数据。此模块中提供的数据如下:
-
CIFAR10 small image classification
-
CIFAR100 small image classification
-
IMDB 电影评论情感分类
-
Reuters newswire topics classification
-
手写数字的 MNIST 数据库
-
时尚文章的 Fashion-MNIST 数据库
-
波士顿住房价格回归数据集
让我们使用 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()
其中
-
Line 1 从 keras 数据集模块导入 minst 。
-
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 创建该模型。
该模型的核心功能如下:
-
输入层由 784 个值(28 x 28 = 784)组成。
-
第一个隐藏层 Dense 由 512 个神经元组成,并使用“relu”激活函数。
-
第二个隐藏层 Dropout 的值为 0.2。
-
第三个隐藏层再次为 Dense,由 512 个神经元组成,并使用“relu”激活函数。
-
第四个隐藏层 Dropout 的值为 0.2。
-
第五个也是最后一个层由 10 个神经元组成,并使用“softmax”激活函数。
-
将 categorical_crossentropy 用作损失函数。
-
Use RMSprop() as Optimizer.
-
Use accuracy as metrics.
-
使用 128 作为批量大小。
-
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)
其中
-
reshape 用于将输入从 (28, 28) 元组重新整形为 (784, )
-
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,它对模型进行评估。它有三个主要参数:
-
Test data
-
Test data label
-
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)
在此,
-
Line 1 使用测试数据调用 predict 函数。
-
Line 2 获取前五个预测
-
Line 3 获取测试数据的头五个标签。
-
Line 5 - 6 打印预测和实际标签。
上述应用程序的输出如下 −
[7 2 1 0 4]
[7 2 1 0 4]
这两个数组的输出是相同的,这表明我们的模型正确预测了前五个图像。
Keras - Convolution Neural Network
让我们将模型从 MPL 修改为 Convolution Neural Network (CNN) 以解决我们先前的数字识别问题。
CNN 可以表示如下 −
该模型的核心功能如下:
-
输入层包含 (1, 8, 28) 值。
-
第一层 Conv2D 包含 32 个滤波器和“relu”激活函数,其核尺寸为 (3,3)。
-
第二层 Conv2D 包含 64 个滤波器和“relu”激活函数,其核尺寸为 (3,3)。
-
第三层 MaxPooling 拥有池尺寸 (2, 2)。
-
第五层 Flatten 用于将其所有输入展平为单维。
-
第六层 Dense 包含 128 个神经元和“relu”激活函数。
-
第七层 Dropout 的值为 0.5。
-
第八个且是最后一层包含 10 个神经元和“softmax”激活函数。
-
将 categorical_crossentropy 用作损失函数。
-
Use Adadelta() as Optimizer.
-
Use accuracy as metrics.
-
使用 128 作为批量大小。
-
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 可以表示为以下内容:
该模型的核心功能如下:
-
输入层包含 (13,) 值。
-
第一层,致密层包含 64 个单元,“relu”激活函数,以及“正常”内核初始化器。
-
第二层,致密层包含 64 个单元和“relu”激活函数。
-
输出层,致密层包含 1 个单元。
-
使用 mse 作为损失函数。
-
Use RMSprop as Optimizer.
-
Use accuracy as metrics.
-
使用 128 作为批量大小。
-
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 电影评论并找出其正面/负面情绪。
用于序列分析的模型可以表示为以下内容 −
该模型的核心功能如下:
-
输入层使用具有 128 个特征的嵌入层。
-
第一层,Dense 由 128 个单元组成,具有法线置零和循环置零,设置为 0.2。
-
输出层,Dense 由 1 个单元和“sigmoid”激活函数组成。
-
使用 binary_crossentropy 作为损失函数。
-
Use adam as Optimizer.
-
Use accuracy as metrics.
-
使用 32 作为批量大小。
-
Use 15 as epochs.
-
使用 80 作为单词的最大长度。
-
使用 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)
在此,
-
imdb 是 Keras 提供的数据集。它表示一系列电影及其评论。
-
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
Keras - Applications
Keras 应用程序模块用于为深度神经网络提供预训练模型。Keras 模型用于预测、特征提取和微调。本章详细解释了 Keras 应用程序。
Pre-trained models
训练好的模型由两个部分组成,模型架构和模型权重。模型权重是大型文件,因此我们必须从 ImageNet 数据库下载和提取特征。下面列出了一些流行的预训练模型:
-
ResNet
-
VGG16
-
MobileNet
-
InceptionResNetV2
-
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
)
在此,
-
include_top 指网络顶部的全连接层。
-
weights 指在 ImageNet 上的预训练。
-
input_tensor 指用于作为模型图像输入的可选 Keras 张量。
-
input_shape 指可选形状元组。该模型的默认输入大小为 224x224。
-
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)
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 。