python 反向传播算法的入门教程的简单代码实现

读到了一篇讲解特别友好的博客,很适合新手学习了解后向传播算法的概念。
但是原作者没有附上代码,所以我便照着教程写了份代码附上。
原教程:反向传播——通俗易懂

源码:

import numpy as np

i1=0.05#输入神经元1
i2=0.10#输入神经元2
b1=0.35#截距项1
b2=0.60#截距项2

w1=0.15
w2=0.20
w3=0.25
w4=0.30
w5=0.40
w6=0.45
w7=0.50
w8=0.55

target_o1=0.01
target_o2=0.99

learn_rate=0.5

#sigmoid函数的实现
def sigmoid(x):
    return 1. / (1 + np.exp(-x))

net_h1=i1*w1+i2*w2+b1
net_h2=i1*w3+i2*w4+b1

out_h1=sigmoid(net_h1)
out_h2=sigmoid(net_h2)

net_o1=out_h1*w5+out_h2*w6+b2
net_o2=out_h1*w7+out_h2*w8+b2

out_o1=sigmoid(net_o1)
out_o2=sigmoid(net_o2)

print("初始输出:",out_o1,out_o2)

def E_total():
    return (np.square(target_o1-out_o1)+np.square(target_o2-out_o2))*0.5
#输出层误差对权重的偏导
def Etotal_w5678(target,out_o,out_h):
    return -(target-out_o)*out_o*(1-out_o)*out_h

#输出层误差
def E_out(target,out_o):
    return -(target-out_o)*out_o*(1-out_o)

#隐含层-隐含层对权重的偏导
def Etotal_w1234(target_1,out_o1,w_ho1,target_2,out_o2,w_ho2,out_h,i):
    return ((E_out(target_1,out_o1))*w_ho1+(E_out(target_2,out_o2))*w_ho2)*out_h*(1-out_h)*i


for i in range(100000):
    # print(w1)
    # print((E_out(target_o1,out_o1))*w5)
    # print((E_out(target_o2,out_o2))*w7)
    #对应分别是期望输出1,输出1,输出1和h1的权重,期望输出2,输出2,输出2和h1的权重,h1的输出,输入i1
    w1=w1-learn_rate*Etotal_w1234(target_o1,out_o1,w5,target_o2,out_o2,w7,out_h1,i1)
    #print(w1)
    w2=w2-learn_rate*Etotal_w1234(target_o1,out_o1,w5,target_o2,out_o2,w7,out_h1,i2)
    w3=w3-learn_rate*Etotal_w1234(target_o1,out_o1,w6,target_o2,out_o2,w8,out_h2,i1)
    w4=w4-learn_rate*Etotal_w1234(target_o1,out_o1,w6,target_o2,out_o2,w8,out_h2,i2)

    #print(w5)
    w5=w5-learn_rate*Etotal_w5678(target_o1,out_o1,out_h1)
    #print(w5)
    w6=w6-learn_rate*Etotal_w5678(target_o1,out_o1,out_h2)
    w7=w7-learn_rate*Etotal_w5678(target_o2,out_o2,out_h1)
    w8=w8-learn_rate*Etotal_w5678(target_o2,out_o2,out_h2)

    net_h1=i1*w1+i2*w2+b1
    net_h2=i1*w3+i2*w4+b1

    out_h1=sigmoid(net_h1)
    out_h2=sigmoid(net_h2)

    net_o1=out_h1*w5+out_h2*w6+b2
    net_o2=out_h1*w7+out_h2*w8+b2

    out_o1=sigmoid(net_o1)
    out_o2=sigmoid(net_o2)
    if(i%10000==0):
        print("第{}次反向传播后,误差为{}".format(i,E_total()))
print("最终输出:",out_o1,out_o2)
print("目标输出:",target_o1,target_o2)
print("偏差值为:",target_o1-out_o1,target_o2-out_o2)
# print(w1)
# print(w2)
# print(w3)
# print(w4)
# print(w5)
# print(w6)
# print(w7)
# print(w8)

运行结果:
python 反向传播算法的入门教程的简单代码实现_第1张图片

你可能感兴趣的:(python,机器学习)