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)
图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)