第一个最简单的BPNN:包括3个输入层节点,3个隐含层节点,1个输出层节点。
学习样本为5个,每次都把5个学习样本都学习一遍,直到学习次数达到预设的次数。
每次学习都记录下误差(或者叫损失)。
为了简单,隐含层和输出层暂时不考虑偏置,等下一次再考虑。
训练了1000次,误差在0.05多些,然后损失就下降得很慢了,估计增加偏置后会好些。
import numpy as np
# --------------------------------------------
# 激活函数
def f_sigmoid(x, derive=False):
if not derive:
return 1 / (1 + np.exp(-x))
else:
return x * (1 - x)
# --------------------------------------------
# 学习的样本,3个维度,增加1个偏置后,维度增加1,共5个样本,因此是4x5的矩阵
X = np.array([[1, 2, 1],
[1, 1, 1],
[1, 2, 2],
[2, 1, 1],
[2, 2, 1]])
# 预期输出,即监督值
Y = np.array([[0],
[0],
[1],
[0],
[1]])
# Weights
np.random.seed(2)
# 4 x 3 ,说明隐藏层有3个结点,但是包括1个偏置,维度增加1
W = 2 * np.random.random((3, 3)) - 1
# 4 x 1 ,说明输出层有1个结点,包含了偏置之后,维度增加1
V = 2 * np.random.random((3, 1)) - 1
#学习的速率
learn_rate = 0.95
#最大训练次数
MAX_LEARN_COUNT = 1000
nLearn_C