python 神经网络原理_神经网络理论基础及Python实现

一、多层前向神经网络

多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;

输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;

除去输入层之外,隐藏层和输出层的层数和为n,则该神经网络称为n层神经网络,如下图为2层的神经网络;

一层中加权求和,根据非线性方程进行转化输出;理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程;

二、设计神经网络结构

使用神经网络之前,必须要确定神经网络的层数,以及每层单元的个数;

为了加速学习过程,特征向量在传入输入层前,通常需要标准化到0和1之间;

离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值

比如:特征值A可能去三个值(a0,a1,a2),那么可以使用3个输入单元来代表A

如果A=a0,则代表a0的单元值取1,其余取0;

如果A=a1,则代表a1的单元值取1,其余取0;

如果A=a2,则代表a2的单元值取1,其余取0;

神经网络既解决分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是两类,则可以用一个输出单元(0和1)分别表示两类;如果多余两类,则每一个类别用一个输出单元表示,所以输出层的单元数量通常等一类别的数量。

没有明确的规则来设计***个数的隐藏层,一般根据实验测试误差和准确率来改进实验。

三、交叉验证方法

如何计算准确率?最简单的方法是通过一组训练集和测试集,训练集通过训练得到模型,将测试集输入模型得到测试结果,将测试结果和测试集的真实标签进行比较,得到准确率。

在机器学习领域一个常用的方法是交叉验证方法。一组数据不分成2份,可能分为10份,

第1次:第1份作为测试集,剩余9份作为训练集;

第2次:第2份作为测试集,剩余9份作为训练集;

……

这样经过10次训练,得到10组准确率,将这10组数据求平均值得到平均准确率的结果。这里10是特例。一般意义上将数据分为k份,称该算法为K-fold cross validation,即每一次选择k份中的一份作为测试集,剩余k-1份作为训练集,重复k次,最终得到平均准确率,是一种比较科学准确的方法。

四、BP算法

通过迭代来处理训练集中的实例;

对比经过神经网络后预测值与真实值之间的差;

反方向(从输出层=>隐藏层=>输入层)来最小化误差,来更新每个连接的权重;

4.1、算法详细介绍

输入:数据集、学习率、一个多层神经网络构架;

输出:一个训练好的神经网络;

初始化权重和偏向:随机初始化在-1到1之间(或者其他),每个单元有一个偏向;对于每一个训练实例X,执行以下步骤:

1、由输入层向前传送:

结合神经网络示意图进行分析:

由输入层到隐藏层:

由隐藏层到输出层:

两个公式进行总结,可以得到:

Ij为当前层单元值,Oi为上一层的单元值,wij为两层之间,连接两个单元值的权重值,sitaj为每一层的偏向值。我们要对每一层的输出进行非线性的转换,示意图如下:

当前层输出为Ij,f为非线性转化函数,又称为激活函数,定义如下:

即每一层的输出为:

这样就可以通过输入值正向得到每一层的输出值。

2、根据误差反向传送 对于输出层:其中Tk是真实值,Ok是预测值

对于隐藏层:

权重更新:其中l为学习率

偏向更新:

3、终止条件

偏重的更新低于某个阈值;

预测的错误率低于某个阈值;

达到预设一定的循环次数;

4、非线性转化函数

上面提到的非线性转化函数f,一般情况下可以用两种函数:

(1)tanh(x)函数:

tanh(x)=sinh(x)/cosh(x)

sinh(x)=(exp(x)-exp(-x))/2

cosh(x)=(exp(x)+exp(-x))/2

(2)逻辑函数,本文上面用的就是逻辑函数

五、BP神经网络的python实现

需要先导入numpy模块

import numpyasnp

定义非线性转化函数,由于还需要用到给函数的导数形式,因此一起定义

def tanh(x):

returnnp.tanh(x)

def tanh_deriv(x):

return1.0 - np.tanh(x)*np.tanh(x)

def logistic(x):

return1/(1 + np.exp(-x))

def logistic_derivative(x):

returnlogistic(x)*(1-logistic(x))

设计BP神经网络的形式(几层,每层多少单元个数),用到了面向对象,主要是选择哪种非线性函数,以及初始化权重。layers是一个list,里面包含每一层的单元个数。

class NeuralNetwork:

def __init__(self, layers, activation='tanh'):

"""

:param layers: A list containing the number ofunitsineach layer.

Should be atleast twovalues

:param activation: The activation functiontobe used. Can be

"logistic"or"tanh"

"""

if activation == 'logistic':

self.activation = logistic

self.activation_deriv = logistic_derivative

elif activation == 'tanh':

self.activation = tanh

self.activation_deriv = tanh_deriv

self.weights = []

foriinrange(1, len(layers) - 1):

self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)

self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)

实现算法

def fit(self, X, y, learning_rate=0.2, epochs=10000):

X = np.atleast_2d(X)

temp= np.ones([X.shape[0], X.shape[1]+1])

temp[:, 0:-1] = X

X = temp

y = np.array(y)

forkinrange(epochs):

i = np.random.randint(X.shape[0])

a = [X[i]]

forlinrange(len(self.weights)):

a.append(self.activation(np.dot(a[l], self.weights[l])))

error = y[i] - a[-1]

deltas = [error * self.activation_deriv(a[-1])]

forlinrange(len(a) - 2, 0, -1):

deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))

deltas.reverse()

foriinrange(len(self.weights)):

layer = np.atleast_2d(a[i])

delta = np.atleast_2d(deltas[i])

self.weights[i] += learning_rate * layer.T.dot(delta)

实现预测

def predict(self, x):

x = np.array(x)

temp= np.ones(x.shape[0]+1)

temp[0:-1] = x

a = temp

forlinrange(0, len(self.weights)):

a = self.activation(np.dot(a, self.weights[l]))

returna

我们给出一组数进行预测,我们上面的程序文件保存名称为BP

fromBP import NeuralNetwork

import numpy asnp

nn = NeuralNetwork([2,2,1], 'tanh')

x = np.array([[0,0], [0,1], [1,0], [1,1]])

y = np.array([1,0,0,1])

nn.fit(x,y,0.1,10000)

foriin[[0,0], [0,1], [1,0], [1,1]]:

print(i, nn.predict(i))

结果如下:

([0, 0], array([ 0.99738862]))

([0, 1], array([ 0.00091329]))

([1, 0], array([ 0.00086846]))

([1, 1], array([ 0.99751259]))

【编辑推荐】

【责任编辑:枯木 TEL:(010)68476606】

点赞 0

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

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

相关文章

postman 使用_Postman使用方法

一 Postman背景介绍用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网页基…

bool python 运算_python基础知识和pycharm安装

昨天大家对我(Python)有了一定的了解,那么今天带大家更加系统化的认识一下我,已经了解我的工作方式先说一下如果让我去做一件事情得需要那些“配置”,其实很简单的,不要把我想的太复杂,毕竟还是个单纯的孩子。让我做事…

python send 案例_python之pexpect实现自动交互的例子

Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互&a…

视频显示边缘空白的真相

在多媒体开发过程中,难免会使用到video这一类型。但一直有部分开发者或产品人员总提出 “视频画面没有充满”其给定的窗口,其原因在于对视频不了解,想当然的去认为要“充满”。被问到此问题只能苦笑一声,哭笑不得。 先看下几个效果…

word公式编辑器_毕业论文里面的各种公式该如何编辑

毕业论文中很多专业都会需要书写很多公式,而对于对Word使用不够熟练的朋友肯定会在编辑公式上很苦恼了,Word自带的公式编辑器又不够方便,本节给大家介绍一种很方便的公式编辑方法,而且更改公式后公式序号会自动跟着变。安装好后打…

Gensee移动SDK之(一)结构组成

gensee 移动sdk现已更新到v3.3,自1.0到3.0的过度当中,经历了几次大的变革。每次变革都新的功能接口和结构上微妙的变化,但直播、点播的结构组成基本定型,即便是扩展也会依此延续。Sdk为了界面上的自由度,不提供完整的U…

python分析服务器日志_python实现web服务器日志分析脚本

python日志分析脚本用python可以实现大日志文件的分析,比如查到sql注入语句,然后看到IP,就可以改下脚本,用IP为特征取出日志,分析入侵过程。python比较shell脚本的优点是速度快,性能好,跑1G日志…

Gensee移动SDK之(二)协议

首先,对于协议而言,有标准的,也有私有的,就看具体使用场景的修饰与更改情况了。部分朋友在接触SDK的时候会提出此疑问,只能说“各怀鬼胎”。第一,即便我们告知我们使用的协议,该用sdk的时候&…

vs点击方法跳不到对于的地方_内脏脂肪怎么测?这个方法也太方便了!| EASD 2020...

我马上开始减肥还不行么?秋天——丰收的日子,看着肥美的鱼蟹,软糯的栗蓉,甜美的桂花糕,不认真贴秋膘都对不起这么丰盛的美食!等等,别想了,看看肚子上层层叠起的肥肉,量量…

Gensee Android SDK(一)组成结构

在分支平台Android上sdk,基本主线不会变,变的只是与平台相关的部分,例如视频采集、音频采集、权限等。 按功能分类分为 RtSDK 重点是可以支持视频互动、发(控制)直播的能力。接口功能上基本上等同于PC客户端。 可以做…

python中msg是什么意思_python下载.msg文件的附件

def get_attachments(file_name, path_name):"""获取.msg文件内的附件:param file_name: .msg文件路径:param path_name: 附件存放目录:return: None"""outlook win32com.client.Dispatch("Outlook.Application").GetNamespace("…

云服务器Ubuntu系统安装apache2发生“E: Unable to locate package”

Ubuntu安装apache2发生“E: Unable to locate package”云服务器安装apache2 出错E: Unable to locate package安装apache2测试apache2安装云服务器安装apache2 出错E: Unable to locate package 最近买了个云主机,操作系统由centos换成Ubuntu的之后,先…

python 构造函数继承_Python多重继承的异构构造器

在Python里面,如果你使用上Qt,SQLAlchemy,Twisted之类各种大型类库时候,有时候多重继承Multiple Inheritance是个简单的解决方法,但是多重继承的复杂性总容易造成误解和疑惑。一般“常识”说,使用super访问…

Android OpenGL Cannot create GL program: 0 GL error: 1282

Android OpenGL create GL program: 0 & GL error: 1282 快速解决 1. 使用GLSurfaceView的话 请在继承类中合适的地方(一般是构造函数里面)设置当前的clientversion 为 2 具体代码: setEGLContextClientVersion(2);2. 使用自己构建的opengl环境的话 请在创…

pythoncsv格式列变换_用Python将csv行转换为列

关于如何使用zip合并数据以及转置列表的一些提示。这听起来像是如何转置csv是你真正的问题。如何转置csv的答案是将其放入列表列表(例如通过csv模块),然后将其转置并写回文件(如果需要)。在row1 [1,2,3]row2 [a, b, c]list(zip(row1, row2))Out[45]: [(1, a), (2,…

Android DDMS的打开以及查看手机页面布局层次

ddms 查看android的界面布局层次 有时候看到一个比较好的界面或体验好的界面,就忍不住想看看其实现结果,那么可以通过DDMS工具来看相连设备层次以及使用哪些view。 上图是查看微信布局展现。说明,这里查看的就是显示在当前屏幕上的界面&am…

python转换窗口无响应_Tkinter窗口显示(没有响应),但代码正在运行

我有一个程序,在你点击一个操作按钮后运行一个很长的过程。当进程运行时,根窗口会说它没有响应,即使我知道程序是在后台运行的。这个程序将发布给我的几个同事,我想确保他们看到这个时不会惊慌失措,关上窗户。我的解决…

mac os11以下安装Xcode

前段时间mac重装系统,所有软件都清除了,下载从商店里面安装Xcode 12.5.1版本,直接提示“要求mac os 11.0或更高版本,于是乎开始升级mac os,检查更新并更新之后,最新版本就是macOS Catalina10.15.7&#xff…

fft之后求模值和相位_如何利用相位噪声测量表征时钟抖动来加速设计验证过程...

随着数据速率的提高,时钟抖动分析的需求也在与日俱增。在高速串行数据链路中,时钟抖动会影响发射机、传输线和接收机的数据抖动。时钟质量保证的测量方法也在不断发展。目前的重点是针对比特误码率(BER) 建立时钟性能和系统性能之间的直接联系。今天我们…

Android Studio 内存不足

android studio 4.2.2 编译的项目的时候,出现的内存不足问题,实际上android studio会有引导设置内存大小,可能都不太在意在哪个地方,设置完就完事了,在不提示的情况下可能找不到在哪设置,在此记录一笔。 出…