Keras深度学习:入门、实战与进阶
上QQ阅读APP看书,第一时间看更新

3.1.2 定义网络

构建深度学习网络的第一步是定义神经网络。神经网络在Keras中被定义为层序列。这些图层的容器是Sequential类。

首先创建Sequential类的实例,后续只需使用layer_dense()函数将各个神经网络层加入模型即可。

> library(keras)
> model <- keras_model_sequential()

深度学习网络由输入层、隐藏层和输出层三部分组成。此实例的数据集不大,这里建立只含有一个隐藏层的神经网络。以下代码使用layer_dense()将输入层与隐藏层加入全连接神经网络模型。全连接神经网络层的特色:上一层与下一层的所有神经元完全连接,且通过管道符号%>%进行连接。网络第一层必须定义预期的输入特征数量,可通过参数input_shape指定特征(feature)个数;参数units表示各层神经元数量;参数kernel_initializer表示权重(weight)和偏置(bias)的初始化值,此处用正态分布的随机数(normal distribution)来初始化;参数activation表示该层使用的激活函数,此处使用ReLU激活函数。

> model %>% layer_dense(units = 40,input_shape = c(9),
+                       kernel_initializer = 'normal',
+                       activation = 'relu')

使用下面的代码建立输出层,使用layer_dense()加入Dense神经网络层。因label(是否生存)是二分类,故最后一层(输出层)采用Sigmoid激活函数。

> model %>% layer_dense(units = 1,activation = 'sigmoid')

通过summary()函数查看创建模型的摘要。执行以下代码,结果如图3-3所示。

> # 查看模型摘要
> summary(model)
067-1

图3-3 查看创建模型的摘要

我们可以看到共有以下两层。

  • 隐藏层:共40个神经元,因为输入层与隐藏层是一起建立的,所以没有显示输入层。
  • 输出层:共1个神经元。

模型的摘要还有Param字段,是统计每一层的超参数,即我们需要通过反向传播算法更新神经元连接的权重与偏差。所以每一层Param的计算方式如下:

Param=(上一层神经元数量)×(本层的神经元数量)+(本层的神经元数量)

隐藏层的Param是400,这是因为9×40+40=400。

输出层的Param是41,这是因为40×1+1=41。

Trainable params表示全部必须训练的超参数,是每一层的Param总和,计算方式如下:400+41=441。

通常,Trainable params数值越大,代表此模型越复杂,需要更多时间进行训练。

除了使用summary()函数打印模型摘要外,我们还可以使用以下功能进一步检查模型:

  • 使用get_config()函数返回一个包含模型配置的列表;
  • 使用get_layer()函数返回图层配置;
  • layers属性可用于检索模型层的扁平列表;
  • 可以使用inputs属性列出输入张量;
  • 可以使用outputs属性检索输出张量。

具体实现代码如下所示。

> # 查看模型配置的列表
> get_config(model)
{'name': 'sequential', 'layers': [{'class_name': 'Dense', 'config': {'name': 'dense', 'trainable': True, 'batch_input_shape': (None, 9), 'dtype': 'float32', 'units': 40, 'activation': 'relu', 'use_bias': True, 'kernel_initializer': {'class_name': 'RandomNormal', 'config': {'mean': 0.0, 'stddev': 0.05, 'seed': None}}, 'bias_initializer': {'class_name': 'Zeros', 'config': {}}, 'kernel_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None}}, {'class_name': 'Dense', 'config': {'name': 'dense_1', 'trainable': True, 'dtype': 'float32', 'units': 1, 'activation': 'sigmoid', 'use_bias': True, 'kernel_initializer': {'class_name': 'GlorotUniform', 'config': {'seed': None}}, 'bias_initializer': {'class_name': 'Zeros', 'config': {}}, 'kernel_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None}}]}
> # 返回图层配置
> get_layer(model,index = 1)
<tensorflow.python.keras.layers.core.Dense>
> # 查看模型层列表
> model$layers
[[1]]
<tensorflow.python.keras.layers.core.Dense>

[[2]]
<tensorflow.python.keras.layers.core.Dense>
> # 查看输入张量
> model$input
Tensor("dense_input:0", shape=(None, 9), dtype=float32)
> # 查看输出张量
> model$output
Tensor("dense_1/Identity:0", shape=(None, 1), dtype=float32)