Python-BP神经网络

最近在学习BP神经网络相关知识,写下这篇文章记录以下,本文分为两个部分。
BP神经网络的介绍相关案例的实现

文章目录

    • 一、BP神经网络的介绍
    • 二、python相关代码的实现

话不多说,进入正题!

一、BP神经网络的介绍

1.BP (Back Propagation) 神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。
2.BP神经网络的结构
Python-BP神经网络_第1张图片

BP神经网络是一种典型的非线性算法。BP神经网络由输入层、输出层和之间若干层(一层或多层)隐含层构成,每一层可以有若干个节点。层与层之间节点的连接状态通过权重来体现。

只有一个隐含层的时候,这样的BP神经网络属于传统的浅层神经网络;当有多个隐含层的时候,这样的BP神经网络属于深度学习的神经网络。

Python-BP神经网络_第2张图片

3.感知器
感知器(Perceptron)的概念,在1950s由Frank Rosenblatt第一次引入。包括输入项、权重、偏置、激活函数、输出组成。
Python-BP神经网络_第3张图片
注意!!!偏置是一定要存在的,如果偏置不存在,就无法分类!!
4.举例分析在BP神经网络中是如何进行运算与运行的。
Python-BP神经网络_第4张图片

在这个例子中,w是我们的权重,b是我们的偏置,s(x)是我们的激活函数,o1与o2下面所对应的就是其真实值。

首先我们要先使用感知器,获得一个output值。
Python-BP神经网络_第5张图片
上图中的net 正是还未代入激活函数的下图
Python-BP神经网络_第6张图片
同样的步骤继续求o1的net值
在这里插入图片描述
之后求出out_o1与out_o2的值
Python-BP神经网络_第7张图片

在这里插入图片描述
之后再利用损失函数
Python-BP神经网络_第8张图片

求出o1与o2所损失的总的值。(其中t是我们的真实值,y是我们的预测值)
在这里插入图片描述
损失函数是利用了最小二分法!!之后继续计算

Python-BP神经网络_第9张图片
下面分别对上式中的部分逐个分析

Python-BP神经网络_第10张图片
Python-BP神经网络_第11张图片
Python-BP神经网络_第12张图片
Python-BP神经网络_第13张图片
其中涉及到了高数部分的链式法则。
在经过计算后我们就可以得到更新后的权值。
Python-BP神经网络_第14张图片
同理,对输入层到隐含层之间的权值进行更新。
Python-BP神经网络_第15张图片

Python-BP神经网络_第16张图片
最后结果:
Python-BP神经网络_第17张图片
随着迭代次数的增多,越来越接近真实值。
以下是推导过程中用到的与权值变化相关的式子
Python-BP神经网络_第18张图片
Python-BP神经网络_第19张图片
Python-BP神经网络_第20张图片

二、python相关代码的实现

import numpy as np
#定义激活函数
def sigmoid(x,deriv=False):
    if deriv == True:
        return x*(1-x)
    return 1/(1+np.exp(-x))
x = np.array([[0,0,0],[0,1,1],[1,0,1],[0,0,1],[0,0,1]])
print(x.shape)
#指定label值
y = np.array([[0],[1],[1],[0],[0]])
print(y.shape)
#指定随机化种子,使得每次随机值一样
np.random.seed(1)
#定义三层的神经网络
w0 = 2*np.random.random((3,4)) - 1
w1 = 2*np.random.random((4,1)) - 1
print(w0)
print(w1)
for j in range(6000):
    l0 = x
    l1 = sigmoid(np.dot(l0,w0))
    l2 = sigmoid(np.dot(l1,w1))
    #真实值-预测值
    l2_error = y - l2
    if j%1000 == 0 :
        print("error"+str(np.mean(np.abs(l2_error))))
    l2_delta = l2_error*sigmoid(l2,deriv=True)
    l1_error = l2_delta.dot(w1.T)
    l1_delta = l1_error*sigmoid(l1,deriv=True)
    #更新w0 w1
    w1 += l1.T.dot(l2_delta)
    w0 += l0.T.dot(l1_delta)

你可能感兴趣的:(Python学习笔记,神经网络,算法,深度学习,机器学习,python)