一、激活函数
为了应对现实世界中的非线性问题,神经网络通常在卷积层之后对输出的神经元进行非线性映射,这种非线性映射就是激活函数。激活函数有很多种,下图列出了常见的激活函数及其公式。但是最常用的激活函数有sigmoid、RELU、LEAKY RELU、Softmax、ELu、tanh这6种, 因此下面着重介绍这五种激活函数。
1.1 Sigmoid
公式:
图像:
可以看到在x>5和x<-5这两端区间sigmoid函数的梯度几乎为0,这会导致梯度在反向传播时,随着隐藏层数的增加,梯度越来越趋近于0,这种现象叫做梯度消失。并且sigmoid函数的函数中心的函数值不为0,而是0.5。为了解决函数中心偏移的问题,出现了tanh函数
1.2 tanh
公式:
图像
但是tanh函数也没有解决梯度消失的问题
1.3 RELU
公式:f(x)=max(0, x)
图像:
RELU一定程度上解决了sigmoid和tanh的梯度消失问题。
1.4Leaky RELU
公式:f(x)=max(0.1x, x)
图像:
1.5 Softmax
公式:
softmax主要用于最后的输出层,经过全连接层之后的数据并不是归一化的。因此需要采用softmax函数对最后输出的数据进行归一化,从而可以表示出该样本属于每个类别的概率。】
1.6 ELU
公式:
ELU解决了RELU在零点不可导的问题
二、模型搭建
2.1 tensorflow中全连接层Dense的参数
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
2.2 通过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
_________________________________________________________________
2.3 利用Functional API搭建
# 导入工具包
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")
进行模型展示
# 模型展示
keras.utils.plot_model(model,show_shapes=True)
2.4 通过构建Model的子类构建模型
# 定义一个model的子类
class MyModel(keras.Model):
# 定义网络的层结构
def __init__(self):
super(MyModel,self).__init__()
# 第一层隐层
self.layer1 = layers.Dense(3,activation="relu",name="layer1")
# 第二个隐层
self.layer2 = layers.Dense(2,activation="relu",name="layer2")
# 输出层
self.layer3 = layers.Dense(2,activation="sigmoid",name = "layer3")
# 定义网络的前向传播
def call(self,inputs):
x = self.layer1(inputs)
x = self.layer2(x)
outputs = self.layer3(x)
return outputs