卷积神经网络的激活函数以及模型搭建的Tensorflow实现

一、激活函数

           为了应对现实世界中的非线性问题,神经网络通常在卷积层之后对输出的神经元进行非线性映射,这种非线性映射就是激活函数。激活函数有很多种,下图列出了常见的激活函数及其公式。但是最常用的激活函数有sigmoid、RELU、LEAKY RELU、Softmax、ELu、tanh这6种, 因此下面着重介绍这五种激活函数。

1.1 Sigmoid

公式:f(x)=\frac{1}{1+e^{-x}}

图像:

可以看到在x>5和x<-5这两端区间sigmoid函数的梯度几乎为0,这会导致梯度在反向传播时,随着隐藏层数的增加,梯度越来越趋近于0,这种现象叫做梯度消失。并且sigmoid函数的函数中心的函数值不为0,而是0.5。为了解决函数中心偏移的问题,出现了tanh函数

1.2 tanh

公式:f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}

图像 

但是tanh函数也没有解决梯度消失的问题

1.3 RELU

公式:f(x)=max(0, x)

图像:

RELU一定程度上解决了sigmoid和tanh的梯度消失问题。

1.4Leaky RELU

公式:f(x)=max(0.1x, x)

图像:

1.5 Softmax

公式:f(z)=\frac{e^{z}}{\sum e^{z}}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值