***1.***导入安装包
import numpy as np
***2.***定义激活函数及其导数
#激活函数
def tanh(x):
return np.tanh(x)
#激活函数导数
def tanh_prize(z):
return 1-tanh(z)**2
或者:
def sigmoid(x):
return 1/(1+np.exp(-x))
#sigmoid导函数性质:f'(t) = f(x)(1 - f(x))
def s_prime(z):
return np.multiply(sigmoid(z), 1.0-sigmoid(z))
***3.***输入输出数据
#输入数据
x=np.array([[1,0,0],[1,0,1],[1,1,0],[1,1,1]])
#理想输出数据
y=np.array([[0,1,1,0]]).T #或y=np.array([[0],[1],[1],[0]])
***4.***权重及学习率
#输入-隐藏1层权重
w1=2*np.random.random((3,3))-1
#隐藏1-隐藏2层权重
w2=2*np.random.random((3,3))-1
#隐藏2-输出层权重
w3=2*np.random.random((3,1))-1
#学习率 改变后训练后的输出变化
lr=0.5
***5.***正反向传播计算
for i in range(20000):
#正向传播
L1=np.dot(x,w1)
z1=tanh(L1)
L2=np.dot(z1,w2)
z2=tanh(L2)
L3=np.dot(z2,w3)
z3=tanh(L3)
error=y-z3#误差
if(i%2000) == 0:#每2000次查看一次
print("error:"+str(np.mean(error)))#打印误差
#逆向传播
L3_delta=error*tanh_prize(z3)#=(理想输出-实际输出)*z3经过激活函数导数
L2_delta=L3_delta.dot(w3.T)*tanh_prize(z2)#=下层误差*层间权值*z2经过激活函数的导数
L1_delta=L2_delta.dot(w2.T)*tanh_prize(z1)#=下层误差*层间权值*z1经过激活函数的导数
#权重更新
w3+=lr*z2.T.dot(L3_delta)
w2+=lr*z1.T.dot(L2_delta)
w1+=lr*x.T.dot(L1_delta)
6.打印训练输出
print("训练输出:")
print(z3)
7.判决输出
def judge(x):
if(x>=0.5):
return 1
else:
return 0
#根据提供的函数对指定序列做映射 map(函数,一个或多个序列)
print("判决结果:")
for i in map(judge,z3):
print(i)
8.运行结果