• 反向传播神经网络
千次阅读
2022-03-25 18:38:45

# 纯python代码实现反向传播神经网络

import numpy as np
def sigmod(z):
h=1./(1+np.exp(-z))
return h
def de_sigmoid(h):
return h*(1-h)

# dim in:输入特征的维度
# list_num hidden:每层输出节点的数目# list_actfuns:每层的激活函数
# list de act funs:反向传播时的函数

def bulid_net(dim_in,list_num_hidden,list_act_funs,list_de_act_funs):
layers=[]
#逐层的进行网络构建
for i in range (len(list_num_hidden)):
layer={}
#定义每一层的权重if i ==0 :
layer["w"]=0.2*np.random.randn(dim_in,list_num_hidden[i])-0.1
else:
layer["w"]=0.2*np.random.randn(list_num_hidden[i-1],list_num_hidden[i])-0.1
#定义每一层的偏置
layer["b"]=0.1*np.ones([1,list_num_hidden[i]])
layer["act_fun"]=list_act_funs[i]
layer["de_act_fun"]=list_de_act_funs[i]
layers.append(layer)
return layers

返回每一层的输入与最后一层的输出
input_layers=[]
for i in range(len(layers)):
layer=layers[i]
if i ==0:
inputs=datas
z=np.dot(inputs,layer["w"])+layer["b"]
h=layer['act_fun'](z)
input_layers.append(inputs)
else:
inputs=h
z=np.dot(inputs,layer["w"])+layer["b"]
h=layer['act_fun'](z)
input_layers.append(inputs)
return input_layers,h

进行参数更新更新
def updata_wb(datas,labs,layers, loss_fun,de_loss_fun ,alpha=0.01):
N,D=np.shape(datas)
进行前馈操作
loss=loss_fun(output,labs)
deltas0=de_loss_fun(output,labs)
从后向前计算误差deltas=[]
for i in range(len(layers)):
index=-i-1
if i==0:
delta=deltas0*layers[index]["de_act_fun"](output)
else:
h=inputs[index+1]
delta=np.dot(delta,layers[index+1]["w"].T)*layers[index]["de_act_fun"](h)
deltas.insert(0,delta)
#利用误差对每一层的权重进行修成for i in range ( len ( layers)) :
#计算dw与db
for i in range(len(layers)):
dw=np.dot(inputs[i].T,deltas[i])
db=np.sum(deltas[i],axis=0,keepdims=True)#梯度下降
layers[i]["w"]=layers[i]["w"]-alpha*dw
layers[i]["b"]=layers[i]["b"]-alpha*db
return layers,loss

def test_accuracy(datas,labs_true,layers) :
lab_det=np.argmax(output,axis=1)
labs_true=np.argmax(labs_true,axis=1)
N_error=np.where(np.abs(labs_true-lab_det)>0)[0].shape[0]
error_rate=Nerror/np.shape(datas)[0]
return error rate

#数据读取
N,D=np.shape(datas)
N_test =N-N_train
unqiue_labs =np.unique(labs).tolist()
dic_str2index={}
dic_index2str={}
for i in range(len(unqiue_labs)):
lab_str=unqiue_labs[i]
dic_str2index[lab_str]=idic_index2str[i]=lab_str
labs_onehot=np.zeros([N,len(unqiue_labs)])
for i in range(N):
lbs_onehot[i,dic_str2index[labs[i]]]=1
perm=np.random.permutation(N)
index_train=perm[:N_train]
index_test=perm[N_train:]
data_train=datas[index_train,:]
lab_train_onehot=labs_onehot[index_train,:]
data_test=datas[index_test,:]
lab_test_onehot=labs_onehot[index_test]
return data_train,lab_train_onehot,data_test,lab_test_onehot,dic_index2str

更多相关内容
• 为了有效地控制激光铣削层质量，建立了激光铣削层质量（铣削层深度、铣削层宽度）与铣削层参数（激光功率、扫描速度和离焦量）之间的反向传播(BP)神经网络预测模型。利用遗传算法(GA)优化了BP神经网络的权值和阈值，...
• 该代码实现了用于教程目的的多层反向传播神经网络，并允许在输入、输出和隐藏层中训练和测试任意数量的神经元。 隐藏层的数量也可以变化。 共有三个文件，其中 MLBPN_Train.m 用于在所需输入模式上构建和训练多层...
• 针对LED光谱数学模型非线性的特点，提出利用一种经改进遗传算法(GA)优化的反向传播(BP)神经网络对LED光谱模型进行辨识。通过改进GA的算子，提高算法收敛效果和辨识精度，利用改进GA对BP神经网络初始和权值阈值进行...
• 神经网络中的反向传播（BackPropagation）介绍及公式推导 神经网络中的激活函数的作用，最常用的两个激活函数Sigmoid 和TanH 代价函数对介绍二次代价函数(Quadratic Cost)，交叉熵代价函数(Cross-entropy Cost)
• 此资源包含着反向传播的应用程序，教你怎么下载和使用。
• 神经网络简单反向传播神经网络该示例代码利用了Florian Rappl的命令解析器： 免责声明该代码旨在作为以下教程中讨论的反向传播神经网络的简单实现： 它仅作为参考/示例实现，不会得到维护或支持。
• 基于人工蜂群的BP神经网络 人工蜂群算法的反向传播神经网络。 基于人工蜂群算法的反向传播神经网络，通过大量尝试提出对神经网络误差调整参数进行优化的方法 BP神经网络 基于人工蜂群的BP神经网络
• 反向传播神经网络的报告1
• 了解反向传播神经网络：有关反向传播神经网络的测试数据和MATLAB代码
• matlab_双隐层反向传播神经网络
• matlab开发-多层反向传播神经网络。多层反向传播神经网络的实现
• 反向传播神经网络–基本原理（反向传播） 反向传播 代价函数/损失函数C (cost/loss) 代价函数是用来估算最后一层节点输出的值 与 目标的值的差距的函数。 如二次方损失函数，C=12n∑x∣∣y(x)−aL(x)∣∣2C = \frac...

# 反向传播神经网络–基本原理（反向传播）

## 反向传播

### 代价函数/损失函数C (cost/loss)

代价函数是用来估算最后一层节点输出的值 与 目标的值的差距的函数。
如二次方损失函数， C = 1 2 n ∑ x ∣ ∣ y ( x ) − a L ( x ) ∣ ∣ 2 C = \frac{1}{2n}\sum_{x} || y(x) - a^{L}(x) ||^2 ，通常为了方便（n表示样本数）计算和求导，会将公式中的n去掉（当只有一个样本时n=1）。

### 基本思路

由于权重w和偏转变量b的值，在没有训练前是存在误差的，所以反向传播是为了找出它们的误差，并且更新它们。我们首先计算出最后一层的误差/偏导数，涉及到两个函数，一个是C损失函数，另一个是激活函数。运用数学上的偏导函数求法和导数的传递性，可以得到最后一层的误差 δ L \delta^L
δ j L = ∂ C ∂ a j L σ ′ ( z j L ) \delta_{j}^{L}=\frac{\partial C}{\partial a_{j}^{L} }\sigma'(z_{j}^{L}) = ( a j L − y ) σ ′ ( z j L ) =(a_{j}^{L} - y )\sigma'(z_{j}^{L}) . 以此模式类推，反向求出每一层的误差/偏导数，最终可以得到关于w的误差和关于b的误差。

### 反向传播公式

如上图，公式中的 δ , w , b , z , a \delta,w,b,z,a 都是向量的写法，表示某一层中变量的集合。使用公式的步骤如下
1、使用公式BP1计算出最后一层的误差。
2、使用公式BP2，BP3，BP4分别计算出倒数第二层的误差，倒数第二层关于b的误差，倒数第二层关于w的误差
3、以此类推，计算到第一层
4、更新w和b
以上过程称为反向传播过程，目的是为了调整w和b。

### 周期，批大小

周期（epoch）：所有的样本都训练了一遍，叫做一个周期。
批大小（batch size）：这个词产生于mini-batch训练方法，一次训练多个样本（批训练样本的个数：batch size），求样本的总体误差，进行模型更新。mini-batch训练方法的泛化性更好。

下一篇 实例计算推演

展开全文
• 一、误差反向传播神经网络的提出 采用非线性连续变换函数，使隐含层神经元具有学习能力。 二、误差反向传播神经网络结构 互连结构 BP神经网络是一种具有三层或三层以上结构的无反馈的层内无互联的前向网络，各层...

全部笔记的汇总贴：《人工神经网络原理》-读书笔记汇总

# 一、误差反向传播神经网络的提出

采用非线性连续变换函数，使隐含层神经元具有学习能力。

# 二、误差反向传播神经网络结构

互连结构

• BP神经网络是一种具有三层或三层以上结构的无反馈的层内无互联的前向网络，各层之间的神经元为全连接关系，每层各个神经元之间无连接。

BP神经网络采用有指导的学习方式进行训练和学习。

BP神经网络采用的“误差反向传播学习算法”是一种误差函数按梯度下降的学习方法。

# 四、误差反向传播学习算法

BP神经网络的学习过程

• 模式顺传播
• 误差逆传播
• 记忆训练
• 学习收敛

标准BP学习算法

BP学习算法的局部极小值问题

• 现象
当学习进行到一定次数后，虽然网络的实际输出与期望输出还存在较大误差，但无论再如何学习，网络全局误差都变化缓慢，或者根本不再发生变化。
• 原因
BP学习算法采用误差函数按梯度下降学习算法。
• 解决方法
适当改变BP神经网络隐含层的单元个数；
给每个初始连接权加上一个很小的随机数。

• 梯度下降

# 六、误差反向传播学习算法的改进

## BP算法存在的问题

学习算法的收敛速度慢

• 学习速率影响收敛速度：学习速率太小，网络的收敛速度慢；学习速率太大，网络会出现振荡而无法收敛。
• 通常学习速率的取值范围为 0.01 ∼ 1 0.01\sim1

存在局部极小点

• 通过设置较小的连接权初始值可以尽量避免该问题。

隐含层层数及节点数的选取缺乏理论指导。

训练时学习新样本有遗忘旧样本的趋势。

## 累计误差校正算法

基本思想

• 计算 m m 个学习模式对的累计误差和 E = ∑ k = 1 m E k E=\sum_{k=1}^mE^k

累计误差校正BP算法与BP算法比较

• 累计误差校正BP算法中，每个连接权值及阈值的校正次数明显减少（每一次学习减少 m − 1 m-1 次校正），减少了学习时间，尤其是在学习模式对较少时，累计误差BP算法的收敛速度要快于BP算法。
• 累计误差BP算法基于 m m 个学习模式对的累计误差和调整连接权值，容易将各个学习模式的误差平均化，容易引起网络振荡。

## Sigmoid函数输出限幅BP算法

基本思想

• 连接权值的调整与隐含层的输出相关，当隐含层的输出为0或1时，连接权校正量 Δ w i j \Delta w_{ij} Δ v j t \Delta v_{jt} 为0，起不到任何校正作用。
• 隐含层的输出由Sigmoid函数的输出决定。
• sigmoid函数具有饱和非线性输出特性
x < − 5 x<-5 时， f ( x ) f(x) 接近于0；
x > + 5 x>+5 时， f ( x ) f(x) 接近于1；
x x 在0附近时（ − 5 ≤ x ≤ 5 -5\le x\le5 ）， f ( x ) f(x) 才真正起到转移作用。

sigmoid函数限幅算法

IF f(x)<=0.01
THEN
f(x)=0.01
else
IF f(x)>=0.99
THEN
f(x)=0.99
ELSE
f(x)保持不变


## 增加动量项的BP算法

标准BP算法在调整连接权值时，只考虑了本次调整时的误差梯度下降方向，而未考虑前一次调整时的误差梯度方向，因而经常使训练过程发生振荡，收敛缓慢。

基本思想

• 在对连接权值进行调整时，按照一定比例加上前一次学习时的调整量，即动量项，力图使连接权的调整向着同一方向进行。
• 可变动量项使连接权的调整随着训练过程变的不断进行而逐渐沿平均方向变化 Δ W i j ( n ) = − β ⋅ ∂ E ∂ W i j + η ( n ) ⋅ Δ W i j ( n − 1 ) \Delta W_{ij}(n)=-\beta\cdot\frac{\partial E}{\partial W_{ij}}+\eta(n)\cdot\Delta W_{ij}(n-1)

## 学习速率自适应调整BP算法

基本思想

• 学习速率使影响BP学习算法的关键因素之一，必须在训练过程中不断调整
• 如果误差不断减小并趋向目标，说明误差修正方向正确，可以增加学习速率；如果误差不断增加并超过预先设定值，说明误差修正方向错误，此时应减少学习速率。
• K i n c K_{inc} 为学习速率增量因子， K d e c K_{dec} 为学习速率减量因子 α ( n + 1 ) = { K i n c ⋅ α ( n )        E ( n + 1 ) < E ( n ) K d e c ⋅ α ( n )        E ( n + 1 ) ≥ E ( n ) \alpha(n+1)=\left\{ \begin{array}{l} K_{inc}\cdot\alpha(n)\;\;\;E(n+1)<E(n) \\ \\K_{dec}\cdot\alpha(n)\;\;\;E(n+1)\ge E(n) \end{array} \right.

# 七、隐含层的特征抽取作用

隐含层也称为特征提取层。

隐含层每个神经元都具有抽取不同输入模式的特征，并将抽取出的特征传递给输出层的能力。

# 八、误差反向传播神经网络的主要能力

• 非线性映射能力
• 泛化能力
• 容错能力
展开全文
• 使用反向传播神经网络进行模式识别的简单教程。 该程序有 3 个类，每类 3 个图像。
• 文章目录BPNN前向传播反向传播总结参考 BPNN BPNN被认为是最常用的预测方法，BPNN模型的一般结构如下图所示，它由输入层、隐层和输出层三层组成，其中隐层在输入层和输出层之间传递着重要的信息。 BPNN总是由一个...

# BPNN

BPNN被认为是最常用的预测方法，BPNN模型的一般结构如下图所示，它由输入层、隐层和输出层三层组成，其中隐层在输入层和输出层之间传递着重要的信息。

BPNN总是由一个或多个隐藏层组成，从而允许网络对复杂功能进行建模。它主要由两个过程组成：正向信息传播和误差反向传播。这三层之间的数学关系可以表示如下：
输入层到隐层：

隐层到输出层：

其中：ym和yj分别表示输入层和隐藏层的输入；yt表示点t的预测值；μjm和λoj表示输出层和隐藏层的网络权重；μj和λo是隐藏层和输出层的阈值；n和I是输入层和隐藏层的节点数；fI和fo分别表示隐藏层和输出层的激活函数。在大多数情况下，通常使用逻辑函数和双曲线函数作为隐含层激活函数fI，而经常使用线性函数作为输出层激活函数fo。

# 前向传播

先讲前向传播，输入a[l-1]，输出是a[l]，缓存为z[l]；从实现的角度来说我们可以缓存下w[l]和ܾb[l]，这样更容易在不同的环节中调用函数。

前向传播的步骤可以写成：

向量化实现过程可以写成：

前向传播需要输入A[0]也就是X来初始化；初始化的是第一层的输入值。a[0]对应于一个训练样本的输入特征，而A[0]对应于一整个训练样本的输入特征，所以这就是这条链的第 一个前向函数的输入，重复这个步骤就可以从左到右计算前向传播。

# 反向传播

输入为da[l],输出为da[l-1],dw[l],db[l]

反向传播的步骤可以写成：

式子（5）由式子（4）带入式子（1）得到，前四个式子就可实现反向函数。

向量化实现过程可以写成：

# 总结

第一层你可能有一个 ReLU 激活函数，第二层为另一个 ReLU 激活函数，第三层可能是 sigmoid 函数（如果你做二分类的话），输出值用来计算损失；这样你就可以向后迭代进行反向传播求导来求݀dw[3],db[3],db[2],dw[1],db[1]。在计算的时候，缓存 会把z[1],z[2],z[3]传递过来，然后回传da[2],da[1]，可以用来计算݀da[0]，但我们不会使用它， 这里讲述了一个三层网络的前向和反向传播，还有一个细节没讲就是前向递归——用输入数据来初始化，那么反向递归（使用 Logistic 回归做二分类）——对A[l]求导。

# 参考

[2] : Xuefan Dong, Ying Lian, Yijun Liu . Small and multi-peak nonlinear time series forecasting using a hybrid back propagation neural network [J].Information Sciences 424 (2018) 39–54

展开全文
• BP神经网络就是一个”万能的模型+误差修正函数“，每次根据训练得到的结果与预想结果进行误差分析，进而修改权值和阈值，一步一步得到能输出和预想结果一致的模型。举一个例子：比如某厂商生产一种产品，投放到市场...
• 基于误差反向传播神经网络的PM2.5预测.pdf
• 基于反向传播神经网络的白车身在线监测.pdf
• 基于反向传播神经网络的自适应SCL译码算法.pdf
• 基于反向传播神经网络的身份证号码识别研究.pdf
• 基于反向传播神经网络的海杂波参数估计.pdf
• 基于反向传播神经网络的变压器绝缘故障诊断方法.pdf
• 基于反向传播神经网络的WSN节点定位方法研究.pdf
• 基于反向传播神经网络的陶瓷损伤参数反演分析.pdf
• 基于反向传播神经网络的压制成型工艺参数优化.pdf
• 基于蝙蝠算法优化反向传播神经网络模型的无线网络流量预测.pdf
• 该库生成通过反向传播训练的完全连接的多层人工神经网络。 使用增量训练模式来训练网络。 XOR示例此示例创建一个神经网络，在输入层具有2个节点，一个包含3个节点的隐藏层，在输出层具有1个节点。 然后网络
• 气象条件与手足口病发病情况的反向传播神经网络模型构建.pdf
• 基于量子粒子群优化反向传播神经网络的手势识别.pdf

...