本文已参与「新人创作礼」活动,一起开启掘金创作之路
BP反向传播神经网络
Code:
# -*- coding: utf-8 -*-
import numpy as np
"""Sigmod激活函数"""
def sigmod(x):
return 1.0/(1.0 + np.exp(-x))
def BackpropCE(W1,W2,X,D):
alpha = 0.9 #学习率
N=4 #4层网络
for k in range(N):
x = X[k,:].T #对数据每行转置
d = D[k] #每行对应结果(标签)
#正向计算
v1 = np.matmul(W1, x)
y1 = sigmod(v1) #对隐藏层结点进行sigmod处理
v = np.matmul(W2,y1)
y = sigmod(v) #对输出层结点进行sigmod处理
#误差逆向传播
e = d - y #误差,即真实值-预测值
delta = e*y*(1-y) #使得e^2最小,对e^2的一阶导数
e1 = np.matmul(W2.T,delta) #隐藏层结点误差
delta1 = y1*(1-y1)*e1
# 修正输入层到隐藏层的权重系数
# dW1 = (alpha*delta1).reshape(4,1)
W1 += (alpha*delta1).reshape(4,1) #更新权重,朝着梯度下降方向,使得误差局部最小
# 修正隐藏层到输出层的权重系数
#dW2 = alpha * delta * y1
W2 += alpha * delta * y1
return W1,W2
def TestBackpropCE():
X = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
D = np.array([[0],[1],[1],[0]])
W1 = 2*np.random.random((4,3))-1
W2 = 2*np.random.random((1,4))-1
for epoch in range(10000):
W1,W2 = BackpropCE(W1, W2, X, D)
N = 4
for k in range(N):
x = X[k,:].T
v1 = np.matmul(W1,x)
y1 = sigmod(v1)
v = np.matmul(W2,y1)
y = sigmod(v)
print(y)
if __name__ == "__main__":
TestBackpropCE()
输出结果: