BP Neural Network

本文详细介绍了BP神经网络的工作原理,包括正向传播和误差反向传播过程,以及训练中的参数调整。BP网络常用于模式识别、故障检测等领域,其结构和算法设计有助于解决非线性问题。训练步骤包括初始化、样本输入、误差计算及权重更新,以逐步优化网络性能。
摘要由CSDN通过智能技术生成

Back Propagation neural work

BP神经网络是前馈型网络,所处理信息逐层向前流动, 当学习时,根据期望输出与实际输出的误差,由前向后逐层修改权值。神经网络原理可对变量进行贡献分析,进而剔除影响不显著和不重要的因素,以简化模型。人工神经网络具有高度的并行结构和并行实现能力,因而其总体处理能力较快。

BP neural network 采用梯度(非线性规划)下降法使权值的改变总是朝着误差变小的方向,最后达到最小误差。它采用非线性规划中的最速下降方法,按误差函数的负梯度方向修改权值。

当前主要应用领域:模式识别,故障检测,智能机器人,非线性系统辨识和控制,市场分析,决策优化,物资调用,智能接口,知识处理,认知科学。

神经网络结构图
这里写图片描述

BP算法在于利用输出层的误差来估计输出层的直接前导层的误差,再利用此误差估计更前一层的误差,如此循环就获得了所有其他各层的误差估计。以此形成将输出端表现出的误差沿着与输入信号传送相反的方向逐级向网络的输入端传递的过程。

BP算法是一个迭代算法,由输入数据正向传播和误差方向传播两个子过程组成。

  1. 工作信号正向传播:输入信号从输入层静隐含层,传向输出层,输出端产生输出信号,信号向前传递过程中网络权值固定不变,每一层神经元的状态只影响到下一层神经元的状态,若输出层得不到期望输出,则误差信号反向传播。
  2. 误差信号反向传播:网络实际输出与期望输出之间的差值即为误差信号,误差由输出端逐层向前传播,网络的权值由误差反馈进行调节,通过不断修正权值是网络实际输出更接近期望输出。

插播:
- 在BP神经网络里,传递函数要求必须可微。
- 神经网络里所使用的函数必须是激活函数,激活函数是指如何把“激活的神经元的特征”通过函数把特征保留并影射出来(保特征,去冗余)。
- 激活函数用来加入非线性因素,毕竟线性模型表达力不够。

训练步骤:

该训练中,我们以一个三层的BP神经网络为例,来做训练描述。
关于所有变量,做如下假设:
网络输入向量: Pk=(a1,a2,...,an)
网络目标向量: Tk=(y1,y2,...,yq)
中间层单元输入向量: Sk=(s1,s2,...,sp) ,输出向量 Bk=(b1,b2,...,bp)
输出层单元输出向量: Lk=(l1,l2,...,lq) ,输出向量 Ck=(c1,c2,...,cq)
输出层至中间层的连接权: wij i=1,2,...n,j=1,2,...p
中间层至输出层的连接权: vjt j=1

BPNeuralNetwork 是一个基于反向传播算法神经网络类,用于解决分类、回归等问题。下面是一个简单的实现示例: ``` python import numpy as np class BPNeuralNetwork: def __init__(self, sizes): self.num_layers = len(sizes) self.sizes = sizes self.biases = [np.random.randn(y, 1) for y in sizes[1:]] self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])] def sigmoid(self, z): return 1.0 / (1.0 + np.exp(-z)) def sigmoid_prime(self, z): return self.sigmoid(z) * (1 - self.sigmoid(z)) def feedforward(self, a): for b, w in zip(self.biases, self.weights): a = self.sigmoid(np.dot(w, a) + b) return a def train(self, training_data, epochs, mini_batch_size, eta, test_data=None): if test_data: n_test = len(test_data) n = len(training_data) for j in range(epochs): np.random.shuffle(training_data) mini_batches = [training_data[k:k+mini_batch_size] for k in range(0, n, mini_batch_size)] for mini_batch in mini_batches: self.update_mini_batch(mini_batch, eta) if test_data: print("Epoch {0}: {1} / {2}".format(j, self.evaluate(test_data), n_test)) else: print("Epoch {0} complete".format(j)) def update_mini_batch(self, mini_batch, eta): nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] for x, y in mini_batch: delta_nabla_b, delta_nabla_w = self.backprop(x, y) nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)] nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)] self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)] self.biases = [b-(eta/len(mini_batch))*nb for b, nb in zip(self.biases, nabla_b)] def backprop(self, x, y): nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] activation = x activations = [x] zs = [] for b, w in zip(self.biases, self.weights): z = np.dot(w, activation) + b zs.append(z) activation = self.sigmoid(z) activations.append(activation) delta = self.cost_derivative(activations[-1], y) * self.sigmoid_prime(zs[-1]) nabla_b[-1] = delta nabla_w[-1] = np.dot(delta, activations[-2].transpose()) for l in range(2, self.num_layers): z = zs[-l] sp = self.sigmoid_prime(z) delta = np.dot(self.weights[-l+1].transpose(), delta) * sp nabla_b[-l] = delta nabla_w[-l] = np.dot(delta, activations[-l-1].transpose()) return (nabla_b, nabla_w) def cost_derivative(self, output_activations, y): return (output_activations-y) def evaluate(self, test_data): test_results = [(np.argmax(self.feedforward(x)), y) for (x, y) in test_data] return sum(int(x == y) for (x, y) in test_results) ``` 这里定义了一个 BPNeuralNetwork 类,包含了神经网络的初始化、前向传播、反向传播、训练、评估等方法。其中,sigmoid 函数和 sigmoid_prime 函数分别表示激活函数及其导数,feedforward 方法表示前向传播,train 方法表示训练,update_mini_batch 方法表示每次更新的小批量数据,backprop 方法表示反向传播,cost_derivative 方法表示误差函数的导数,evaluate 方法表示测试评估。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值