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 函数可以省略,以减少计算机运算量。

        

'''

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

'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mixiy(米思齐)安装

Mixiy(米思齐)安装 官网地址:爱上米思齐 打开官网,选择下图的软件进行下载 复制提取码,点击链接跳转到网盘进行下载,选择(RC4完整版) 下载完成后,解压到合适的位置,进入文件夹,双击Mixly.exe即…

Spark SQL【Java API】

前言 之前对 Spark SQL 的影响一直停留在 DSL 语法上面,感觉可以用 SQL 表达的,没有必要用 Java/Scala 去写,但是面试一段时间后,发现不少公司还是在用 SparkSQL 的,京东也在使用 Spark On Hive 而不是我以为的 Hive O…

C++数据结构——哈希表

前言:本篇文章将继续进行C数据结构的讲解——哈希表。 目录 一.哈希表概念 二.哈希函数 1.除留取余法 三.哈希冲突 1.闭散列 线性探测 (1)插入 (2)删除 2. 开散列 开散列概念 四.闭散列哈希表 1.基本框架 …

一.ffmpeg 将内存中的H264跟PCM 数据流合成多媒体文件

在有一些嵌入式平台中,H264数据流一般来自芯片内部的硬编码器, AAC音频数据则是通过采集PCM进行软编码,但是如何对它实时进行封装多媒体文件 ,参考ffmpeg example,花了一些时间终于实现了该功能。 流程图如下&#xf…

es问题汇总--待完善

1. 查询某个索引库中数据总量 方式一: CountRequest 鄙人喜欢这种方式 public long getTotalNum(String indexName) throws IOException {CountRequest countRequest new CountRequest(indexName);// 如果需要,你可以在这里添加查询条件// countReques…

内脏油脂是什么?如何减掉?

真想减的人,减胖是很容易的,但想要形体美又健康,还是得从减内脏油脂开始,那么,问题来了,什么是内脏油脂? 油脂它分部于身体的各个角落,四肢、腹部、腰、臀部、脸、脖子...等&#xf…

暴雨信息液冷计算解决方案亮相CCIG 2024

5月24日,2024中国图象图形大会(CCIG)在陕西西安正式开幕。作为涵盖图像图形各专业领域的综合性的全国性学术会议,CCIG面向开放创新、交叉融合的发展趋势,为图像图形相关领域的专家学者和产业界的同仁,搭建了…

深入用户内心:设计师如何通过可用性测试洞察用户需求

可用性测试是指让用户体验产品的原型或成品。设计师通过观察和分析用户的使用行为和感受,进一步合理地改进产品的设计方法。你可能会想知道我们可以用什么方法来测试可用性?随着互联网行业的快速迭代更新,可用性测试衍生出了许多类型和方法。…

【C++初阶】—— 类和对象 (下)

📝个人主页🌹:EterNity_TiMe_ ⏩收录专栏⏪:C “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 类和对象 1. 运算符重载运算符重载赋值运算符重载前置和后置重载 2. 成员函数的补充3. 初始化列…

报错:找不到或无法加载主类 com.example.SpringbootApplication(idea)

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 错误: 找不到或无法加载主类 com.example.SpringbootApplication 原因: java.lang.NoClassDefFoundError: com/example/SpringBootAppli…

C++---运算符重载

运算符重载介绍 在类中重新定义运算符,赋予运算符新的功能以适应类的运算,就称为运算符重载。 运算符重载是一种形式的C多态,它使得对象操作更直观,本质上也是属于函数重载。 实际上,我们已经在不知不觉之中使用了运算符重载。例如&#xff…

【JAVA |再谈接口、Object、内部类】Object类中子类重写,Cloneable 接口、比较器、内部类

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈 ✨✨ 帅哥美女们,我们共同加油!一起…

python写页面自动截图

from selenium import webdriver def take_screenshot(url, file_path):driver webdriver.Chrome()driver.get(url)driver.save_screenshot(file_path)driver.quit() if __name__ __main__:take_screenshot(http://baidu.com, D:\桌面\wang.png)要安装selenium还要安装google…

React类组件生命周期详解

在React的类组件中,从组件创建到组件被挂载到页面中,这个过程react存在一系列的生命周期函数,最主要的生命周期函数是componentDidMount、componentDidUpdate、componentWillUnmount 生命周期图例如下 1. componentDidMount组件挂载 如果你…

网络安全资源和参考指南

由美国国防部(DoD)发布的《网络安全资源和参考指南》,旨在为美国政府、商业部门以及美国盟友和伙伴之间的安全合作提供有用的、现成的参考资料。文档涵盖了网络安全规范、最佳实践、政策和标准,这些都是由美国联邦政府、国防部以及…

KubeSphere 社区双周报|2024.05.09-05.23

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.05.09-05.23…

CCF20230301——田地丈量

CCF20230301——田地丈量 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a,b;cin>>n>>a>>b;int x1,x2,y1,y2,x,y,sum0;for(int i0;i<n;i){cin>>x1>>y1>>x2>>y2;xmin(x2,a)-max(x1,…

【科普知识】伺服电机中的内置制动器

在工业自动化和机器人技术快速发展的今天&#xff0c;伺服电机作为核心驱动元件&#xff0c;其性能与功能直接影响整个系统的运行效率与稳定性。 近年来&#xff0c;一体化伺服电机技术不断融合创新&#xff0c;并逐步加入了许多新的硬件和软件的功能&#xff0c;为工业自动化领…

SpringBoot+Vue开发记录(五)-- 数据库设计

我去&#xff0c;时隔这么久又开始了QAQ。主要是还是自己太懒了。 本篇文章的主要内容是数据库设计。 先简单创建个数据库&#xff1a; 这是创建好了的&#xff1a; 一、数据库设计 先就做一个很简单的设计&#xff0c;里面就只有用户和题。 大概就这样&#xff1a; 二、创…

GQL 来了!ISO/IEC 正式发布 GQL 数据库国际标准!

历时四年筹备&#xff0c;超过20个国家的标准和技术专家参与制定&#xff0c;ISO/IEC GQL &#xff08;图查询语言&#xff09;标准于2024年4月12日正式发布&#xff01; 作为国际标准化组织&#xff08;ISO&#xff09;继 1987年 发布SQL后&#xff0c;唯一发布的数据库查询语…