7. 3 层神经网络的实现和输出层的激活函数

目录

1. 3 层神经网络的实现

1.1 输入层数据到 1 层神经元

1.2 1 层神经元到 2 层神经元

1.3 2 层神经元到输出层神经元

2. 输出层的激活函数

2.1 恒等函数

2.2 softmax 函数

2.2.1 softmax 函数表达式

2.2.2 softmax 代码实现

 2.2.3 softmax 的改进

2.2.3 softmax 函数特征


1. 3 层神经网络的实现

        下面我们看一下简单的 3 层神经网络,它由输入层、1层神经元、2层神经元、输出层神经元组成。因为神经元是 3 层,所以称之为 3 层神经网络。

简单的 3 层神经网络

        前面我们已经讲了输出层数据到 1 层时候的激活函数问题,现在我们考虑三层转换:

  1.         输入层数据到 1 层神经元
  2.         1 层神经元到 2 层神经元
  3.         2 层神经元到输出层神经元

1.1 输入层数据到 1 层神经元

        下图可以看到输入层数据到 1 层神经元的示意图

输入层数据到 1 层神经元

         按照先前的假设,

  1. 输入层的数据为 X,输入层到 1 层的权重为 W1;1 层到 2 层的权重为 W2;2 层到 输出层的权重为 W3;
  2. 输入层的灰色 1 圆圈为输入层的 “偏置” B1,1 层神经元的灰色 1 圆圈为1层的 “偏置” B2;2 层的灰色 1 圆圈为2层的 “偏置” B3;
  3. 1 层收到的数据为 A1;2 层收到的数据为 A2;输出层收到的数据为 A3;
  4. Z1 用来表示 1 层神经网络通过激活函数转换后的信号;

        那么到达 1 层神经网络的数据为

        A1=np.dot(X,W1)+B1

        假设1 层神经网络通过激活函数为 sigmoid 函数。

        Z1=sigmoid(A1)

1.2 1 层神经元到 2 层神经元

         1 层神经元到 2 层神经元,其实非常类似输入层数据到 1 层神经元。2 层收到的数据为 A2;Z2 用来表示 2 层神经网络通过激活函数转换后的信号;2 层神经元的激活函数为 sigmoid 函数。

        A2=np.dot(Z1,W2)+B2

        Z2=sigmoid(A2)

1.3 2 层神经元到输出层神经元

2 层神经网络到输出层神经元

        2 层神经元到 输出层神经元,区别在于它的激活函数不一样。输出层收到的数据为 A3;Z3 用来表示输出层神经网络通过激活函数转换后的信号。

        A3=np.dot(Z2,W3)+B3

       输出层的激活函数,可以用 \sigma () 来表示,其读作 sigma。\sigma () 可以是恒等函数(输入和输出相等),也可以是其他函数,视具体需要。

        Z3=\sigma (A2)

2. 输出层的激活函数

        在神经网络中,输出层的激活函数,要根据求解问题的性质决定。一般的回归问题可以使用恒等函数,二元分类问题可以使用 sigmoid 函数,多元分类问题可以使用 softmax 函数。

        机器学习的问题大致可以分为分类问题和回归问题。分类问题就是数据属于哪一个类别的问题。而回归问题是根据某个输入预测一个(连续的)数值问题。

        输出层的激活函数,可以用 \sigma () 来表示,其读作 sigma。

2.1 恒等函数

        恒等函数( identity_function )将输入按照原样输出,不加以任何改动地直接输出。

2.2 softmax 函数

        下面是 softmax 函数示意图

softmax 函数示意图

2.2.1 softmax 函数表达式

        softmax 函数表达式如下:

        y_{_{k}}=\exp (a_{_{k}})/\sum_{1}^{n}\exp (a_{_{i}});分子是输入信号a_{k}的指数函数,分母是所有输入信号的指数函数的和。使用softmax 函数时候,输出层的各个神经元都受到所有输出信号的影响。

2.2.2 softmax 代码实现

        按照 softmax 函数表达式,利用 NumPy 模块的函数,可以实现 softmax 函数。请见如下代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def softmax(a):
    exp_a=np.exp(a)
    sum_exp_a=np.sum(exp_a)
    y=exp_a/sum_exp_a
    return(y)
a1=np.arange(0,100,1)
a2=np.arange(0,200,1)
y1=softmax(a1)
y2=softmax(a2)
plt.plot(a1,y1,label="softmax a1")
plt.plot(a2,y2,linestyle="dashdot",label="softmax a2")
plt.xlabel("a line")
plt.ylabel("y line")
plt.xlim(0,200) #指定 x 轴的位置
plt.ylim(-0,1) #指定 y 轴的位置
plt.title(" softmax a1 & softmax a2")
plt.legend()
plt.show()

        为了让大家更直接的看到 softmax 的特性,我特意准备了两套数据,可以看到,在 k 越接近 n 时候,y_{_{k}} 越接近 1。y 曲线不是平稳上升的,在很大的区间范围内,它都接近于 0 ,只是在数据区间的末端,才迅猛上升,无限接近于 1。

        

softmax 数据示意图

 

 2.2.3 softmax 的改进

        如果大家写代码时候关注计算机的性能和溢出问题,就会注意到 softmax 函数中的 exp 很容易溢出计算机的有限数据宽度。也就是说,该函数能表示的数值范围是有限的。

        科学家们经过改良,将 softmax 改为如下形式:

softmax 改进公式

        其中 C 理论上是一个任意的非 0 常数,C可以是任意值,但是为了防止溢出,一般使用输入信号中的最大值。

        经过改良后的 softmax 代码实现为 softmax_improve:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def softmax(a):
    exp_a=np.exp(a)
    sum_exp_a=np.sum(exp_a)
    y=exp_a/sum_exp_a
    return(y)
def softmax_improve(a):
    c=np.max(a)
    exp_a=np.exp(a)
    sum_exp_a=np.sum(exp_a-c)
    y=exp_a/sum_exp_a
    return(y)
a1=np.arange(0,100,1)
a2=np.arange(0,200,1)
y1=softmax_improve(a1)
y2=softmax_improve(a2)
plt.plot(a1,y1,label="softmax_improve a1")
plt.plot(a2,y2,linestyle="dashdot",label="softmax_improve a2")
plt.xlabel("a line")
plt.ylabel("y line")
plt.xlim(0,200) #指定 x 轴的位置
plt.ylim(-0,1) #指定 y 轴的位置
plt.title(" softmax a1 & softmax a2")
plt.legend()
plt.show()
softmax_improve 数据示意图

2.2.3 softmax 函数特征

        从上图我们可以看出 softmax 函数的特征:

  1. 输出归一化:softmax 函数的输出是 0.0 到 1.0 之间的实数,并且 函数的输出值总和是 1。正是因为这个性质,才可以把其输出解释为概率;
  2. 单调性:即使使用了 softmax 函数,输入信号之间的大小关系也不会改变,因为 exp 指数函数是单调递增的;一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果,而输出值最大的神经元位置不会变化,所以该神经网络进行分类时候,输出层的 softmax 函数可以省略,以减少计算机运算量。

        

'''

要是大家觉得写得还行,给我回复几个字吧,想给博客涨涨人气,非常感谢!

'''

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南野栀子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值