Keras 简明教程

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
_________________________________________________________________