简单BP算法

import numpy as np
def sigmoid(x):
    return 1/(1+np.exp(-x))
def derivative_sigmoid(x):
    return np.multiply(sigmoid(x), (1-sigmoid(x)))
# 输入x的值
X = np.matrix("2, 4, -2")
# 设置权重矩阵:W : 3*2
W = np.random.normal(size=(3, 2))
# label
ycap = [0]
# 训练数量
num_examples = 1
# 设置步长
h = 0.01
# 正向传播
# 1、输入层到输出层的计算   y=x*w
y = np.dot(X, W)
# 2、激活函数运算   y_0 = sigmoid(y)
y_o = sigmoid(y)
# 3、损失计算
loss = -np.sum(np.log(y_o[range(num_examples), ycap]))
# 4、输出损失结果
print(loss)


# 反向传播
temp1 = np.copy(y_o)
# 1、求损失函数对激活函数结果的偏导数
temp1[range(num_examples), ycap] = 1 / -(temp1[range(num_examples), ycap])
temp = np.zeros_like(y_o)
temp[range(num_examples), ycap] = 1
dcost = np.multiply(temp, temp1)
# 2、求从激活函数层到输出层的微分
dy_o = derivative_sigmoid(y)
# 3、矩阵中的元素相乘
dgrad = np.multiply(dcost, dy_o)
dw = np.dot(X.T, dgrad)
# 4、权重跟新
W -= h * dw
# 5、再使用更新后的权重向前传播计算新的误差值
y = np.dot(X, W)
yo = sigmoid(y)
loss = -np.sum(np.log(yo[range(num_examples), ycap]))
# 6、输出新的误差值
print(loss)

你可能感兴趣的:(简单BP算法)