发布于2020-03-31 13:15 阅读(2387) 评论(0) 点赞(28) 收藏(5)
画图和编辑公式实在是太麻烦了,我就写在纸上吧
一、BP推导
一个简单的神经网络:
正向传播:
1.输入层---->隐含层:
这里我们要把得到的值通过sigmoid激活一下:
2.隐含层---->输出层:同理
这样我们就得到了输出值out(o1)和out(o2),此时这两个输出值和我们预想的输出值肯定相差甚远(可以自己设定几个数试一试)那么我们就要进行反向传播来修正w以此来修正输出值。
反向传播:
1.我们所期望的数据和输出数据的误差:
2.隐含层---->输出层的权值更新:
以w5为例,我们想知道w5对整体误差产生了多少影响
那么我们再拆分看每一项:
我们现在更新W5(lr是学习率):
W6,W7,W8更新同理……
3.隐含层---->隐含层的权值更新(以更新W1为例):
我们先简化一下网络,看的更清楚一些。这个稍微有一点复杂……
这看着很复杂,静下心来,自己写一遍就很清楚了,其实挺简单的
最后更新W1:
二、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]))# 输出预测值
原文链接:https://blog.csdn.net/weixin_38132153/article/details/105199680
作者:imsorry
链接:https://www.pythonheidong.com/blog/article/292183/e5df8e9d9832d83928f9/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!