Keras 101

Keras 是一个高层次库,该库允许使用 TensorFlow 作为后端深度学习库。TensorFlow 团队将 Keras 包含在 TensorFlow 核心中,作为其模块 tf.keras。在写此篇文章时,除了 TensorFlow,Keras 也支持 Theano 和 CNTK。

Keras 的以下指导原则另其在深度学习社区非常流行:

  • 提供一致的且简单的 API
  • 允许多种元素表示为可接插模块
  • 添加新模块作为类和函数
  • Python 原生代码和模型配置
  • 可直接使用的通用网络架构,支持 CNN、RNN 或二者的结合

通过此篇文章的提醒,我们将了解到如何使用低层次 TensorFlow API 和 高层次 Keras API 构建不同类型的深度学习和机器学习模型。

此篇文章将涉及到如下几个主题:

  • 安装 Keras
  • 在 Keras 中创建模型工作流
  • 使用 sequential(顺序)和 functional(功能) API 创建 Keras 模型
  • Keras 层
  • 使用 sequential 和 functional API 创建和增加层
  • 编译 Keras 模型
  • 训练 Keras 模型
  • 使用 Keras 模型预测
  • Keras 中的额外模块
  • Keras 的 sequential 模型示例 —— MNIST 数据集

安装 Keras

可以在 Python 3 中使用以下命令安装 Keras:

pip3 install keras

要在其它环境中安装或从源代码安装 Keras,请访问以下链接:

https://keras.io/#installation

Keras 中的神经网络模型

Keras 中的神经网络模型定义为“层图”。Keras 中的模型可以使用 sequential 或 functional API 创建。functional 和 sequential API都可以构建任意类型的模型。functional API 使得创建含有“多重输入”、“多重输出”和“共享层”的复杂模型变得简单。

因此,作为一个经验法则,我们会看到工程师们使用 sequential API 创建简单的层构建的简单模型,以及使用 functional API 构建设计分支和共享层的复杂模型。我们同样观察到使用 functional API 构建简单的模型,使得模型增长为带有分支和共享层的复杂模型更简单。因此,我们的工作中总是会用到 functional API。

Keras 中构建模型工作流

Keras 中简单的工作流入下:

  • 创建模型
  • 为模型创建并添加层
  • 编译模型
  • 训练模型
  • 使用模型预测或评估

让我们来逐一详述以上这些步骤。

创建 Keras 模型

可以使用 sequential API 或 functional API 创建 Keras 模型。使用这两种方法创建模型的例子在以下子章节中会提到。

用于创建 Keras 模型的 Sequential API

在 Sequential API 中,可以使用以下代码创建空模型:

model = Sequential()

你现在可以为这个模型添加层,也是接下来将要提到的。

另外,你也可以在构造函数中传递所有层的列表。例如,我们给构造函数传递了四个层,代码如下:

model = Sequential([Dense(10, input_shape=(256,)),
                    Activation('tanh'),
                    Dense(10),
                    Activation('softmax')
                   ])

用于创建 Keras 模型的 Functional API

在 Functional API 中,你可以创建 Model 类的实例作为模型,这个实例将接收输入和输出参数。输入和输出参数相应地代表了一个或多个输入和输出张量。

举个例子,使用以下代码使用 functional API 实例化一个模型:

model = Model(inputs=tensor1, outputs=tensor2)

上述代码中,tensor1 He tensor2 要么是张量,要么是可以视作张量的对象,例如,Keras 的 layer(层)对象。

如果输入或输出张量不止一个,则多个张量可以作为列表传入,如下所示:

model = Model(inputs=[i1,i2,i3], outputs=[o1,o2,o3])

Keras 层

Keras 提供了若干个内建的“层”类,用于简化网络架构的建设。以下章节给出了由 Keras 2 提供的多种类型层的总结和描述。

Keras 核心层

Keras 核心层实现了几乎可以用在所有网络架构的基本操作。以下表格给出了由 Keras 2 提供的层的总结和描述。

层名称描述
Dense这是一个简单的全连接神经网络层。这个层产生如下函数的输出:
activation((inputs x weights)+bias) 其中 activation 指的是传递给层的激活函数,函数默认参数为 None。
Activation该层给输出应用了激活函数。这个层产生以下函数的输出:
activation(inputs) 其中 activation 指的是传递给层的激活函数。
以下激活函数可以用作实例化一个层:
softmax,elu,selu,softplus,softsign,relu,tanh,sigmoid,hard_sigmoid和linear
Dropout该层给输入层以一定的失活率应用随机失活正则化。
Flatten该层将输入扁平化,也就是,对于三维输入来说,此层将扁平化为一维输出。
Reshape该层将输入转化为指定的形状。
Permute该层按照每个指定的模式重排输入维度。
RepeatVector该层根据指定的次数重复输入。因此,若输入是一个二维张量,形状为(#样例,#特征),以及此层给定的重复次数为 n,则输出为一个三维特征,形状为(#样例,n,#特征)。
Lambda该层将指定的函数包在一个层里。因此,能产生特定输出的自定义函数将作为参数传入。此层为 Keras 提供了终极扩展能力,以供用户添加自定义的函数作为层。
ActivityRegularization该层将 L1 或 L2,或两种正则化类型的结合应用到输入层。此层同样可以用作激活函数输出层,或包含激活函数的输出层。
Masking该层在输入张量中屏蔽或跳过这些时间步长,其中输入张量中的所有值都等于作为此层参数提供的屏蔽值。

Keras 卷积层

这些层为卷积神经网络实现了不同类型的卷积、抽样和剪裁运算:

层名称描述
Conv1D该层将单个空间或时间维度上的卷积应用于输入。
Conv2D该层将二维卷积应用于输入。
SeparableConv2D该层在每个输入通道上应用深度空间卷积,然后是逐点卷积,将所得到的输出通道混合在一起。
Conv2DTranspose该层将卷积的形状恢复为产生这些卷积的输入的形状。
Conv3D该层将三维卷积应用于输入。
Cropping1D该层沿时间维度裁剪输入数据。
Cropping2D此图层沿空间维度裁剪输入数据,例如图像的宽度和高度。
Cropping3D该层沿着时空(即所有三个维度)裁剪输入数据。
UpSampling1D该层按时间轴指定的时间重复输入数据。
UpSampling2D此图层沿两个维度按指定时间重复输入数据的行和列维度。
UpSampling3D该层按三个维度的指定时间重复输入数据的三个维度。
ZeroPadding1D该层将零添加到时间维度的开头和结尾。
ZeroPadding2D此图层将行和列的零添加到2D张量的顶部,底部,左侧或右侧。
ZeroPadding3D该层将零添加到3D张量的三个维度。

Keras 池化层

这些层为卷积神经网络实现了不同的池化操作:

层名称描述
MaxPooling1D该层实现一维输入数据的最大池化操作。
MaxPooling2D该层实现二维输入数据的最大池化操作。
MaxPooling3D 该层实现三维输入数据的最大池化操作。
AveragePooling1D该层实现一维输入数据的平均池化操作。
AveragePooling2D该层实现二维输入数据的平均池化操作。
AveragePooling3D 该层实现三维输入数据的平均池化操作。
GlobalMaxPooling1D该层实现一维输入数据的全局最大池化操作。
GlobalAveragePooling1D 该层实现一维输入数据的全局平均池化操作。
GlobalMaxPooling2D 该层实现二维输入数据的全局最大池化操作。
GlobalAveragePooling2D 该层实现二维输入数据的全局平均池化操作。

Keras 局部连接层

这些层在卷积神经网络中能用得到:

层名称描述
LocallyConnected1D该层通过在输入的每个不同补丁处应用不同的滤波器组,将单个空间或时间维度上的卷积应用于输入,从而不共享权重。
LocallyConnected2D通过在输入的每个不同补丁处应用不同的滤波器组,该层将二维卷积应用于输入,从而不共享权重。

Keras 递归层

这些层实现了不同类型的递归神经网络:

层名称描述
SimpleRNN该层实现了完全连接的递归神经网络。
GRU该层实现了门控循环单元网络。
LSTM该层实现了长期的短期记忆网络。

Keras 内嵌层

现在,只有一个内嵌层可用了:

层名称描述
Embedding该层采用由索引组成的2D张量形状
(batch_size,sequence_length),
并产生由密集的形状向量组成的张量
(batch_size,sequence_length,output_dim)。

Keras 融合层

这些层合并两个或多个输入张量,并通过应用每个层表示的特定操作产生单个输出张量:

层名称描述
Add该层计算输入张量的元素加法。
Multiply该层计算输入张量的逐元素乘法。
Average该层计算输入张量的逐元素平均值。
Maximum该层计算输入张量的逐元素最大值。
Concatenate此图层沿指定轴连接输入张量。
Dot该层计算两个输入张量中的样本之间的点积。
add, multiply, average, maximum, concatenate, 和 dot这些函数表示此表中描述的各个合并层的功能接口。

Keras 高级激活层

这些层实现了高级激活功能,这些功能无法作为简单的底层后端功能实现。 它们的操作类似于我们在核心层部分中介绍的激活层:

层名称描述
LeakyReLU该层计算ReLU激活功能的泄漏版本。
PReLU该层计算参数ReLU激活函数。
ELU该层计算指数线性单位激活函数。
ThresholdedReLU该层计算ReLU激活函数的阈值版本。

Keras 规范化层

目前,只有一个规范化层可用:

层名称描述
BatchNormalization该层在每批中标准化前一层的输出,使得该层的输出近似为具有接近零的平均值和接近1的标准偏差。

Keras 噪音层

可以将这些层添加到模型中,以通过添加噪声来防止过度拟合;这些层也被称为正则化层。 这些层的操作方式与核心层部分中的 Dropout() 和 ActivityRegularizer() 层的操作方式相同。

给 Keras 模型添加层

上一节中提到的所有图层都需要添加到我们之前创建的模型中。 在以下部分中,我们将介绍如何使用功能API和顺序API添加图层。

在功能API中,首先以功能方式创建层,创建模型时,输入和输出层作为张量参数提供,就像我们一样在上一节中介绍那样。

举例如下:

首先,创建输入层:

input = Input(shape=(64,))

其次,以功能方式从输入层创建稠密层:

hidden = Dense(10)(inputs)

以同样的方式,以功能方式从前几层创建更深层次的隐藏层:

hidden = Activation('tanh')(hidden)
hidden = Dense(10)(hidden)
output = Activation('tanh')(hidden)

最终,实例化带有输入输出层的模型对象:

model = Model(inputs=input, outputs=output)

有关创建顺序和功能性Keras模型的更深入细节,您可以阅读Antonio Gulli和Sujit Pal,Packt Publishing,2017年题为“Deep learning with keras”的书。

编译 Keras 模型

前面部分中构建的模型需要先使用 model.compile() 方法进行编译,然后才能用于训练和预测。 compile() 方法的完整签名如下:

compile(self, optimizer, loss, metrics=None, sample_weight_mode=None)

compile方法有三个参数:

  • optimizer:您可以指定自己的功能或 Keras 提供的功能之一。 此函数用于更新优化迭代中的参数。 Keras 提供以下内置优化器功能:
    • SGD
    • RMSprop
    • Adagrad
    • Adadelta
    • Adam
    • Adamax
    • Nadam
  • loss:您可以指定自己的损失函数或使用提供的损失函数之一。 优化器函数优化参数,以便最小化此损失函数的输出。 Keras提供以下损失功能:
    • mean_squared_error
    • mean_absolute_error
    • mean_absolute_percentage_error
    • mean_squared_logarithmic_error
    • squared_hinge
    • hinge
    • categorical_hinge
    • sparse_categorical_crossentropy
    • binary_crossentropy
    • poisson
    • consine_proximity
    • binary_accuracy
    • categorical_accuracy
    • sparse_categorical_accuracy
    • top_k_categorical_accuracy
    • sparse_top_k_categorical_accuracy
  • metrics:第三个参数是训练模型时需要收集的度量列表。 如果启用了详细输出,则会为每次迭代打印度量标准。 指标就像损失函数;一些由 Keras 提供,能够编写您自己的度量函数。 所有损失函数也可用作度量函数。

训练 Keras 模型

训练Keras模型就像调用 model.fit() 方法一样简单。 该方法的完整签名如下:

fit(self, x, y, batch_size=32, epochs=1-, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)

你可以在Keras网站上阅读详细信息,https://keras.io/models/sequential/

对于我们之前创建的示例模型,使用以下代码训练模型:

model.fit(x_data, y_labels)

使用 Keras 模型预测

训练的模型可用于使用 model.predict() 方法预测值,或使用 model.evaluate() 方法评估模型。

这两种方法的签名如下:

predict(self, x, batch_size=32, verbose=0)
evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)

Keras 中的额外模块

Keras提供了几个附加模块,这些模块补充了基本工作流程(此文章开头所述)以及其他功能。 部分模块如下:

  • 预处理(preprocessing)模块提供了几种预处理序列,图像和文本数据的功能。
  • 数据集(dataset)模块提供了多种功能,可以快速访问几个流行的数据集,如CIFAR10图像,CIFAR100图像,IMDB电影评论,路透社新闻专题,MNIST手写数字和波士顿房价。
  • 初始化(initializer)模块提供了若干函数给每个层设置随机权重参数。例如,Zeros,Ones,Constant,RandomNormal,RandomUniform,TruncatedNormal,VarianceScaling,Orthogonal,Identity,lecun_normal,lecun_unform,glorot_normal,glorot_uniform,he_normal 和 he_uniform。
  • models模块提供了几个函数来恢复模型体系结构和权重,例如model_from_json,model_from_yaml 和 load_model。 可以使用 model.to_yaml() 和model.to_json() 方法保存模型体系结构。 可以通过调用 model.save() 方法来保存模型权重。 权重保存在HDF5文件中。
  • 应用程序模块提供了几个预构建和预先训练的模型,如 Xception,VGG16,VGG19,ResNet50,Inception V3,InceptionResNet V2 和 MobileNet。 我们将学习如何使用预建模型来预测我们的数据集。 我们还将学习如何使用来自略有不同的域的数据集重新训练应用程序模块中的预训练模型。

这就结束了我们对 Keras 的简要介绍,这是 TensorFlow 的高级框架。 我们将在本教程中提供使用Keras构建模型的示例。

Keras 序列模型举例——MNIST 数据集

以下是构建简单多层感知器(在第5章中详细介绍)的一个小例子,用于对MNIST集中的手写数字进行分类:

# import the keras modules
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import SGD
from keras import utils
import numpy as np
# define some hyper parameters
batch_size = 100
n_inputs = 784
n_classes = 10
n_epochs = 10
# get the data
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# reshape the two dimensional 28 x 28 pixels
# sized images into a single vector of 784 pixels
x_train = x_train.reshape(60000, n_inputs)
x_test = x_test.reshape(10000, n_inputs)
# convert the input values to float32
x_train = x_train.astype(np.float32)
x_test = x_test.astype(np.float32)
# normalize the values of image vectors to fit under 1
x_train /= 255
x_test /= 255
# convert output data into one hot encoded format
y_train = utils.to_categorical(y_train, n_classes)
y_test = utils.to_categorical(y_test, n_classes)
# build a sequential model
model = Sequential()
# the first layer has to specify the dimensions of the input vector
model.add(Dense(units=128, activation='sigmoid', input_shape=(n_inputs,)))
# add dropout layer for preventing overfitting
model.add(Dropout(0.1))
model.add(Dense(units=128, activation='sigmoid'))
model.add(Dropout(0.1))
# output layer can only have the neurons equal to the number of outputs
model.add(Dense(units=n_classes, activation='softmax'))
# print the summary of our model
model.summary()
# compile the model
model.compile(loss='categorical_crossentropy',
              optimizer=SGD(),
              metrics=['accuracy'])
# train the model
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=n_epochs)
# evaluate the model and print the accuracy score
scores = model.evaluate(x_test, y_test)
print('\n loss:', scores[0])
print('\n accuracy:', scores[1])

我们从描述和训练Keras模型得到以下输出:

Using TensorFlow backend.
 
 Layer (type)                 Output Shape              Param #   
 dense_1 (Dense)              (None, 128)               100480    
 
 dropout_1 (Dropout)          (None, 128)               0         
 
 dense_2 (Dense)              (None, 128)               16512     
 
 dropout_2 (Dropout)          (None, 128)               0         
 
 dense_3 (Dense)              (None, 10)                1290      
 Total params: 118,282
 Trainable params: 118,282
 Non-trainable params: 0
 
 Epoch 1/10
 60000/60000 [==============================] - 3s 45us/step - loss: 2.3189 - acc: 0.1149
 Epoch 2/10
 60000/60000 [==============================] - 2s 35us/step - loss: 2.2513 - acc: 0.1761
 Epoch 3/10
 60000/60000 [==============================] - 2s 33us/step - loss: 2.1656 - acc: 0.2686
 Epoch 4/10
 60000/60000 [==============================] - 2s 30us/step - loss: 2.0350 - acc: 0.3792
 Epoch 5/10
 60000/60000 [==============================] - 2s 36us/step - loss: 1.8411 - acc: 0.4734
 Epoch 6/10
 60000/60000 [==============================] - 2s 36us/step - loss: 1.6026 - acc: 0.5484: 0s - loss: 1.64
 Epoch 7/10
 60000/60000 [==============================] - 2s 32us/step - loss: 1.3812 - acc: 0.6058
 Epoch 8/10
 60000/60000 [==============================] - 2s 31us/step - loss: 1.2057 - acc: 0.6496
 Epoch 9/10
 60000/60000 [==============================] - 2s 29us/step - loss: 1.0779 - acc: 0.6844
 Epoch 10/10
 60000/60000 [==============================] - 2s 25us/step - loss: 0.9752 - acc: 0.7150
 10000/10000 [==============================] - 0s 34us/step
 loss: 0.855843718529
 accuracy: 0.7909

您可以看到在Keras中构建和训练模型是多么容易。

您可以从他们记录完备的网站 https://keras.io 获取有关Keras的更多信息。

总结

在本篇文章中,我们了解了 Keras。 Keras 是 TensorFlow 最受欢迎的高级库。 我个人更喜欢将 Keras 用于我为商业制作和学术研究开发的所有模型。 我们学习了使用功能和顺序 API 在 Keras 中创建和训练模型所遵循的工作流程。 我们了解了各种 Keras 图层以及如何将图层添加到顺序和功能模型中。 我们还学习了如何编译,训练和评估 Keras 模型。 我们还看到了 Keras 提供的一些附加模块。

在本书的其余文章中,我们将介绍核心 TensorFlow 和 Keras 中的大多数示例。 在下一篇文章中,我们将学习如何使用 TensorFlow 构建传统的机器学习模型进行分类和回归。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据