手推BP算法及python实现

画图和编辑公式实在是太麻烦了,我就写在纸上吧

一、BP推导

一个简单的神经网络:
手推BP算法及python实现_第1张图片
正向传播:
1.输入层---->隐藏层
手推BP算法及python实现_第2张图片
这里我们要把得到的值通过sigmoid激活一下:
手推BP算法及python实现_第3张图片
2.隐藏层---->输出层:同理
手推BP算法及python实现_第4张图片
这样我们就得到了输出值out(o1)和out(o2),此时这两个输出值和我们预想的输出值肯定相差甚远(可以自己设定几个数试一试)那么我们就要进行反向传播来修正w以此来修正输出值。

反向传播:
1.我们所期望的数据和输出数据的误差:

2.隐含层---->输出层的权值更新:
以w5为例,我们想知道w5对整体误差产生了多少影响
手推BP算法及python实现_第5张图片
那么我们再拆分看每一项:
手推BP算法及python实现_第6张图片

我们现在更新W5(lr是学习率):
手推BP算法及python实现_第7张图片
W6,W7,W8更新同理……

3.隐含层---->隐含层的权值更新(以更新W1为例):
我们先简化一下网络,看的更清楚一些。这个稍微有一点复杂……
手推BP算法及python实现_第8张图片

手推BP算法及python实现_第9张图片

这看着很复杂,静下心来,自己写一遍就很清楚了,其实挺简单的

最后更新W1:
手推BP算法及python实现_第10张图片

二、BP代码
最后附上代码:

import numpy as np

def sigmoid(x): #设置激活函数
    return 1 / (1 + np.exp(-x))

if __name__ == "__main__":
    # 初始化
    lr = 0.05 # 学习率
    Iter = 100001 # 迭代次数
    w1 = [[0.10, 0.20], [0.30, 0.40]]  # 输入层-->隐藏层权值
    w2 = [[0.50, 0.60], [0.70, 0.80]]  # 隐藏层-->输出层权值
    b1 = 0.10 # bias
    b2 = 0.20
    input = [0.05,0.10] # 输入
    target = [0.50,1.00] # 输出

    net1 = np.dot(w1,input) + b1
    net_out = sigmoid(net1) # 激活函数
    net2 = np.dot(w2,net_out) + b2
    out = sigmoid(net2) # 激活函数
    for n in range(Iter): # 开始迭代
        delta2 = np.multiply(-(target - out),np.multiply(out,1-out)) * net_out
        delta1 = np.multiply(np.dot(np.array(w2).T, delta2), np.multiply(net_out, 1 - net_out)) * np.array(input)

        for i in range(len(w2)):
            w2[i] = w2[i] - lr * delta2[i]
        for i in range(len(w1)):
            w1[i] = w1[i] - lr * delta1[i]

        # 前向传播
        net1 = np.dot(w1, input) + b1
        net_out = sigmoid(net1)
        net2 = np.dot(w2, net_out) + b2
        out = sigmoid(net2)
        if(n%1000 == 0):
            print(str(n) + " result:" + str(out[0]) + ", result:" + str(out[1]))# 输出预测值

手推BP算法及python实现_第11张图片

你可能感兴趣的:(手推BP算法及python实现)