【Python】使用numpy进行神经网络激活函数算法描述

【Python】使用numpy进行神经网络激活函数算法描述

系统:macOS 10.14.5 IDE:PyCharm 2018.2.4

一、What

1.1 NumPy

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。 NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  1. 一个强大的N维数组对象 ndarray
  2. 广播功能函数
  3. 整合 C/C++/Fortran 代码的工具
  4. 线性代数、傅里叶变换、随机数生成等功能

1.2 激活函数

神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

二、Why 

最近接触了一些AI的知识点,感觉Python在这方面还是很有优势的,特别是库的应用,很多精彩的算法公式都可以通过Python简洁的表达出来,主要是numpy,提供了大量数学工具,在激活函数中描述相关的表达式非常方便。

三、How

3.1 准备工作

3.1.1 安装numpy和matplotlib

1、打开偏好设置

2、选择工程文件,选择Project Interpreter,点击+号

3、搜索numpy,点击Install Package

4、稍等片刻,IDE底部会有状态条提示,安装成功后出现如下提示

5、用同样的方式安装matplotlib 

6、然后回到代码中检查是否能import 

import numpy as npimport matplotlib.pyplot as plt

没有标红即正常,as表示给这个库命名,把上面的两个库命名为np和plt是目前通用做法,matplotlib.pyplot主要是用来画图,后面我们会用它来绘制函数的曲线。

3.2 基础数组与画图操作

3.2.1 生成数组

首先我们用numpy生成一个数组,使用arange函数直接生成一维数组,传入一个整数说明数组的长度 

import numpy as np
import matplotlib.pyplot as plta1 = np.arange(9)
print(a1)

3.2.2 绘制曲线

我们把这个数组画出来,使用matplotlib.pyplot的plot函数和show函数实现  plot函数用于绘制曲线,当只传入一组数组时,x轴默认为0,1,2……,y轴为传入的值。

import numpy as np
import matplotlib.pyplot as plta1 = np.arange(9)
print(a1)plt.plot(a1)
plt.show()

这样不够直观,我们在plot中增加一个参数 

plt.plot(a1,’k-o’)中的k-o是设置所绘制图形的颜色、线条类型、图形类型,其中k表示黑色,-表示实线,o表示圆点, 这样子9个点都显示出来了。其他线条类型请参考 https://blog.csdn.net/qiurisiyu2016/article/details/80187177

3.3 Sigmoid公式

上面的公式的作用是将任意实数转换为0~1之间的数,方便后续处理,让我们看看它是如何实现的。

3.3.1 fz=-z

我们来一步一步解析,为了使数组更有代表性,我们给arange()函数传入两个参数 ,代表取数的范围从[-5,6),然后在plot()函数中加一个参数,让横坐标使用我们指定的数组:

可以看到,绘制的曲线为一条斜率为-1的直线。

3.3.2 fz=np.exp(-z)

np.exp(z)是以e为底,以输入参数z为指数的指数函数,数学表达式为fz=e^z

可以看到,绘制的曲线为一条递减的曲线,区间为(0,+∞),其中可以看到经典值e^0=1,e^1=2.718……(自然常数),由于小数点后位数较多,自动转换成了科学计数法,e表示10^,第一个数1.4841e+02即1.4841*10^2≈148,可以看到图中的 第一个点就在150附近。

3.3.3 fz=1+np.exp(-z)

这一步非常重要,如果不进行这一步操作,后续在取倒数时,会发现值的区间超出1,比如当np.exp(-z)=0.1时,1/np.exp(-z)=10,这样整个函数的区间还是(0,+∞),对数据范围限制作用就没有了。

3.3.4 fz=1/(1+np.exp(-z))

这个就是神经网络中的激活函数Sigmoid公式的具体实现,我们看一下它的曲线

这个可以说是非常经典的曲线了,可以看到它是区间(0,1)的递增曲线,并且增长趋势是先加速后减速,类似在动画制作中的小车运动曲线。

但是在实际使用过程中,它依然会存在一些问题,比如在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失、收敛缓慢、幂运算求解耗时等等,具体缺点说明可以参考

https://blog.csdn.net/tyhj_sf/article/details/79932893

中的详细介绍。

3.4 tanh函数

这个函数的取值区间为(-1,1) ,它的输出是0均值(原点左边+原点右边=0) ,一定程度上可以解决收敛缓慢的问题。

tanh(z)=(np.exp(z)-np.exp(-z))/(np.exp(z)+np.exp(-z))

我们还是来慢慢解析它。

3.4.1 fz=np.exp(z)-np.exp(-z)

这个结构看起来复杂,我们拆成两部分

np.exp(z)

即e^z次方,看看指数爆炸一般的增长

然后是np.exp(-z),这个图像我们之前有显示过了,就是曲线图形跟上面对称,递减的函数

那么两个函数相减的图像是什么呢?

可以看到,这个图像跟sigmoid图像的曲线趋势可以说完全相反,它先加速上升,然后中间缓慢,后面又加速上升,有点像我们学习新东西的过程,一开始大量吸收知识点快速上升,到了瓶颈期进展缓慢,过了以后又快速发展。

3.4.2 fz=np.exp(z)+np.exp(-z)

两个函数相加,可以猜到的是,他们会形成一个抛物线(开口朝下)

3.4.3 fz=(np.exp(z)-np.exp(-z))/(np.exp(z)+np.exp(-z))

tanh函数之前介绍过,它是一个区间(-1,1)的函数,由一个递增函数与一个抛物线函数之商所得,它的特点如前所述,取值区间为(-1,1) ,输出是0均值(原点左边+原点右边=0)。

3.5 Relu函数

目前比较流行的一种函数,ReLU虽然简单,但却是近几年的重要成果,有以下几大优点: 1) 解决了gradient vanishing问题 (在正区间) 2)计算速度非常快,只需要判断输入是否大于0 3)收敛速度远快于sigmoid和tanh

公式如下:

Relu=max(0,x)

它是分区间的函数,当z取值大于0时,取z值本身,小于等于0时,取0,函数实现及图像如下:

import numpy as np
import matplotlib.pyplot as pltz = np.arange(-5, 6)print(z)
fz = np.arange(11)
for i in range(11):if z[i] > 0:fz[i] = z[i]else:fz[i] = 0print(fz)plt.plot(z, fz, 'k-o')plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于灰狼算法GWO的城市三维无人机路径规划(复杂地形三维航迹路径规划)

摘要 本文提出了一种利用灰狼算法GWO来解决城市环境下无人机三维路径规划问题的方法。这种方法将复杂的无人机航迹规划任务转化为一个优化问题,然后运用灰狼算法GWO来解决这个优化问题。灰狼算法GWO是一种模拟灰狼种群捕猎行为的优化算法,它具备强大的全…

2024年第一届CS2major,新胶囊即将发行,需要提前做哪些布局

2024年第一届CS2major,将会在3月17日哥本哈根开始。 所以: 1、新的胶囊大概率会在3月10日左右发布。 2、网传战队挂坠,不知道是否会出现?(原本出现过战队布章包,由于销量太差,第二届就取消了…

Crossover24新版发布!搭载Wine9提升Mac游戏体验!

2024年2月28日,著名的软件Crossover正式推出了2024年的首个全新版本Crossover24。Crossover 24版本的更新带来了许多功能优化和游戏优化,使用户能够更好地在Mac系统上运行各种软件和游戏,并且支持32位旧版软件的兼容运行。 Crossover24最新版…

Nodejs 第五十章(lua的基本使用)

lua基本使用 全局变量局部变量 全局变量是在全局作用域中定义的变量,可以在脚本的任何地方访问。全局变量在定义时不需要使用关键字,直接赋值即可。 xiaoman xmzsprint(xiaoman)局部变量是在特定作用域内定义的变量,只能在其所属的作用域…

Openfeign+Ribbon+Hystrix断路器(服务降级)

热部署对于Hystrix的热不是不是很明显 所以最好修改代码之后重启服务 简介 在微服务架构中存在多个可直接调用的服务,这些服务若在调用时出现故障会导致连锁效应,也就是可能让整个系统变得不可用,这种情况我们称之为服务雪崩效应. 服务雪崩效应通常发生在微服务架构中&…

LeetCode——回溯算法(Java)

回溯算法 简介[中等] 77. 组合[中等] 216. 组合总和 III[中等] 17. 电话号码的字母组合[中等] 39. 组合总和[中等] 40. 组合总和 II[中等] 131. 分割回文串[中等] 93. 复原 IP 地址[中等] 78. 子集[中等] 90. 子集 II[中等] 491. 非递减子序列[中等] 46. 全排列[中等] 47. 全排…

【学习笔记】Vue3源码解析:第二部分-实现响应式(4)

课程地址:【已完结】全网最详细Vue3源码解析!(一行行带你手写Vue3源码) 第二部分-实现响应式(4):(对应课程的第15-17节) 第15节:《处理数组修改或者新增》 …

Qt 使用QListView实现简约美观的聊天窗口

今天和大家分享一个使用QListView来展现聊天窗口的历史记录的例子, 因为聊天记录可能会有很多, 所以使用试图-模型的方式更加合理 这是最终效果: ChatHistoryModel继承自QAbstractListModel , ChatHistoryViewDelegate继承自QStyledItemDelegate, 这个例子最关键的就是在QSty…

【Java JVM】对象回收判断

Java 对象回收判断是程序设计中至关重要的一环。在面向对象的编程中, 合理的对象回收策略直接影响着程序的性能和内存利用效率。 因此, 深入了解和准确判断 Java 对象的回收时机, 不仅可以优化程序的运行性能, 还能有效避免内存泄漏和资源浪费。 本文将简单的分析一下 JVM 中对…

JRT缓存协议测试

JRT由DolerGet提供可信的缓存数据获取,在OMR修改和删除数据后会更新缓存的数据,这样的话本Web下通过DolerGet取的数据是可信的。在多个Web之间要保证缓存数据的可信度,需要同步修改的数据到其他Web,为此仿照了缓存协议的效果&…

MySQL的三大范式

文章目录 简介第一范式第二范式第三范式: 简介 在MySQL的使用中, 要根据实际灵活设计表,一般来说我们通常遵循三大范式(啥是范式:是一些约束、规范、规则, 来优化数据库表的设计和存储),三大范…

Stable Diffusion 模型分享:3D Animation Diffusion(3D动漫)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 3D Animation Diffusion 是 Lykon 大神的 3D 动漫模型。 作者述:在迪士尼、皮…

停止Tomcat服务的方式

运行脚本文件停止 运行Tomcat的bin目录中提供的停止服务的脚本文件 关闭命令 # sh方式 sh shutdown.sh# ./方式 ./shutdown.sh操作步骤 运行结束进程停止 查看Tomcat进程,获得进程id kill进程命令 # 执行命令结束进程 kill -9 65358 操作步骤 注意 kill命令是…

ffmpeg使用vaapi解码后的视频如何基于x11或EGL实现0-copy渲染?

技术背景 对于ffmpeg硬解码后渲染常见的做法是解码后通过av_hwframe_transfer_data方法将数据从GPU拷贝到CPU,然后做一些转换处理用opengl渲染,必然涉及到譬如类似glTexImage2D的函数将数据上传到GPU。而这样2次copy就会导致CPU的使用率变高&#xff0c…

智能物联时代下RFID技术在汽车零部件智能制造中的引领作用

RFID(Radio Frequency Identification,射频识别)技术在汽车零部件加工中有广泛的应用,其工作原理是通过无线电频率进行自动识别。在汽车零部件加工中,RFID技术可以发挥重要作用,提高生产效率、降低成本和减…

js形参传递特殊字符

在前端我们给其他页面传值或者传数据到后台的时候,字符串经常将一些特殊符号识别成字符集。这种情况下会将数据打断或者打乱,比如字符串里面包含*/&这些符号的时候就会错误。 我们可以通过将字符中的特殊字符替换成十六进制的字符,一些特…

【Linux从青铜到王者】进程信号

——————————————————————————————————————————— 信号入门 在了解信号之前有许多要理解的相关概念 我们可以先通过一个生活例子来初步认识一下信号 1.生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来…

从事测绘地信,你需要这些插件、软件、小工具、图源...

特别声明,本篇是来自公众号GIS前沿的资源,看着比较好,特别给大家推荐。加粗样式 今天,我们又来汇总了一些工作中实用的插件、小工具、数据等等,小助手又来帮你提高工作效率了****。 因为小助手每年都会总结一次&…

15.Django总结

文章目录 1.Django创建项目的命令2.MVC,MVT的理解3.Django中间件的使用4.WSGI,uWSGI服务器 和 uwsgi协议5.nginx和uWISG 服务器之间如何配合工作的6.django开发中数据库做过什么优化7.Python中三大框架各自的应用场景8.django如何提升性能(高并发)9. 什么是restful api谈谈你的…

MySQL性能优化-数据库调优有哪些维度可以选择

数据库调优的目标 简单来说,数据库调优的目的就是要让数据库运行得更快,也就是说响应的时间更快,吞吐量更大。 不过随着用户量的不断增加,以及应用程序复杂度的提升,我们很难用“更快”去定义数据库调优的目标&#…