1 神经网络的搭建
接下来我们来构建如下图所示的神经网络模型:
tf.Keras中构建模有两种方式,一种是通过Sequential构建,一种是通过Model类构建。前者是按一定的顺序对层进行堆叠,而后者可以用来构建较复杂的网络模型。首先我们介绍下用来构建网络的全连接层:
tf.keras.layers.Dense( units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros')
主要参数:
- units: 当前层中包含的神经元个数
- Activation: 激活函数,relu,sigmoid等
- use_bias: 是否使用偏置,默认使用偏置
- Kernel_initializer: 权重的初始化方式,默认是Xavier初始化
- bias_initializer: 偏置的初始化方式,默认为0
1.1 通过Sequential构建
Sequential() 提供一个层的列表,就能快速地建立一个神经网络模型,实现方法如下所示:
# 导入相关的工具包 import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 定义一个Sequential模型,包含3层 model = keras.Sequential( [ # 第一层:激活函数为relu,权重初始化为he_normal layers.Dense(3, activation="relu", kernel_initializer="he_normal", name="layer1",input_shape=(3,)), # 第二层:激活函数为relu,权重初始化为he_normal layers.Dense(2, activation="relu", kernel_initializer="he_normal", name="layer2"), # 第三层(输出层):激活函数为sigmoid,权重初始化为he_normal layers.Dense(2, activation="sigmoid", kernel_initializer="he_normal", name="layer3"), ], name="my_Sequential" )
接下来我们使用:
# 展示模型结果 model.summary()
如下所示:
Model: "my_Sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= layer1 (Dense) (None, 3) 12 _________________________________________________________________ layer2 (Dense) (None, 2) 8 _________________________________________________________________ layer3 (Dense) (None, 2) 6 ================================================================= Total params: 26 Trainable params: 26 Non-trainable params: 0 _________________________________________________________________
通过这种sequential的方式只能构建简单的序列模型,较复杂的模型没有办法实现。
参数量计算:以第一个隐层为例:该隐层有3个神经元,每个神经元的参数为:4个(w1,w2,w3,b1),所以一共用3x4=12个参数。
1.2 利用function API构建
tf.keras 提供了 Functional API,建立更为复杂的模型,使用方法是将层作为可调用的对象并返回张量,并将输入向量和输出向量提供给 tf.keras.Model
的 inputs
和 outputs
参数,实现方法如下
# 导入工具包 import tensorflow as tf # 定义模型的输入 inputs = tf.keras.Input(shape=(3,),name = "input") # 第一层:激活函数为relu,其他默认 x = tf.keras.layers.Dense(3, activation="relu",name = "layer1")(inputs) # 第二层:激活函数为relu,其他默认 x = tf.keras.layers.Dense(2, activation="relu",name = "layer2")(x) # 第三层(输出层):激活函数为sigmoid outputs = tf.keras.layers.Dense(2, activation="sigmoid",name = "layer3")(x) # 使用Model来创建模型,指明输入和输出 model = tf.keras.Model(inputs=inputs, outputs=outputs,name="my_model")
同样通过:
# 展示模型结果 model.summary()
结果如下所示:
Model: "my_model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input (InputLayer) [(None, 3)] 0 _________________________________________________________________ layer1 (Dense) (None, 3) 12 _________________________________________________________________ layer2 (Dense) (None, 2) 8 _________________________________________________________________ layer3 (Dense) (None, 2) 6 ================================================================= Total params: 26 Trainable params: 26 Non-trainable params: 0 _________________________________________________________________
另外也可以通过:
# 模型展示 keras.utils.plot_model(model,show_shapes=True)
1.3 通过model的子类构建
通过model的子类构建模型,此时需要在__init__中定义神经网络的层,在call方法中定义网络的前向传播过程,实现方法如下:
# 导入工具包 import tensorflow as tf # 定义model的子类 class MyModel(tf.keras.Model): # 在init方法中定义网络的层结构 def __init__(self): super(MyModel, self).__init__() # 第一层:激活函数为relu,权重初始化为he_normal self.layer1 = tf.keras.layers.Dense(3, activation="relu", kernel_initializer="he_normal", name="layer1",input_shape=(3,)) # 第二层:激活函数为relu,权重初始化为he_normal self.layer2 =tf.keras.layers.Dense(2, activation="relu", kernel_initializer="he_normal", name="layer2") # 第三层(输出层):激活函数为sigmoid,权重初始化为he_normal self.layer3 =tf.keras.layers.Dense(2, activation="sigmoid", kernel_initializer="he_normal", name="layer3") # 在call方法中万完成前向传播 def call(self, inputs): x = self.layer1(inputs) x = self.layer2(x) return self.layer3(x) # 实例化模型 model = MyModel() # 设置一个输入,调用模型(否则无法使用summay()) x = tf.ones((1, 3)) y = model(x)
同样的我们也可以通过summay方法来查看模型构建的结果
2 神经网络的优缺点
2.1 优点
- 精度高,性能优于其他的机器学习方法,甚至在某些领域超过了人类
- 可以近似任意的非线性函数
- 随之计算机硬件的发展,近年来在学界和业界受到了热捧,有大量的框架和库可供调用
2.2 缺点
- 黑箱,很难解释模型是怎么工作的
- 训练时间长,需要大量的计算力
- 网络结构复杂,需要调整超参数
- 小数据集上表现不佳,容易发生过拟合
3 总结
- 知道深度学习与机器学习的关系
深度学习是机器学习的一个子集,主要区别在是否包含特征工程
- 知道神经网络是什么
一种模仿生物神经网络结构和功能的 计算模型
- 知道常见的激活函数
默认使用relu,二分类是sigmoid, 多分类是softmaxs
- 知道参数初始化的常见方法
随机初始化,标准初始化,Xavier初始化,He初始化
- 能够利用tf.keras构建神经网络模型
Sequential的方法,Model的函数式编程,构建model的子类实现
- 了解神经网络的优缺点