图片引用https://www.cnblogs.com/charlotte77/p/5629865.html
#BP算法
#参考 https://www.cnblogs.com/charlotte77/p/5629865.html
# -*- coding: utf-8 -*-
import numpy as np
#实现2层神经网络: 输入层 -> 隐藏层 -> 输出层
#初始化输入层输出层数据
inputs = np.array([0.05,0.1])
outputs = np.array([0.01,0.99])
#初始化输入层,隐藏层,输出层神经元个数
input_layer_neurons_num = inputs.shape[0]
hidden_layer_neurons_num = 2
output_layer_neurons_num = outputs.shape[0]
LEARNING_RATE = 0.5 #学习率
#初始化权重(W):输入层->隐藏层,隐藏层->输出层
if False :
hidden_layer_weights = np.random.random((hidden_layer_neurons_num, input_layer_neurons_num))
output_layer_weights = np.random.random((output_layer_neurons_num,hidden_layer_neurons_num))
else:
hidden_layer_weights = np.array([[0.15,0.20],[0.25,0.30]])
output_layer_weights = np.array([[0.40,0.45],[0.50,0.55]])
#正向传播 激活函数sigmoid
for j in range(10000):
#隐藏层
net_h = hidden_layer_weights@inputs + 0.35
out_h = 1 / (1 + np.exp(-net_h))
#输出层
net_o = output_layer_weights@out_h + 0.60
out_o = 1 / (1 + np.exp(-net_o))
#正向传播 - end
#反向传播
#计算输出层误差
#Δw = α * ∂Eⱼ/∂wᵢ 更新 W(隐藏层->输出层)
output_layer_weights_temp = output_layer_weights
for i in range(output_layer_weights.shape[0]):
E_weights_output_derivation = -(outputs[i] - out_o[i])*out_o[i]*(1-out_o[i])*out_h
output_layer_weights_temp[i,:] = output_layer_weights[i,:] - LEARNING_RATE * E_weights_output_derivation
for i in range(hidden_layer_weights.shape[0]):
E_output = -(outputs - out_o)*out_o*(1-out_o)
E_weights_hidden_derivation = np.sum(E_output*output_layer_weights[i,:])*out_h*(1-out_h)*inputs
hidden_layer_weights[i,:] = hidden_layer_weights[i,:] - LEARNING_RATE * E_weights_hidden_derivation
output_layer_weights = output_layer_weights_temp
net_h_test = hidden_layer_weights@inputs + 0.35
out_h_test = 1 / (1 + np.exp(-net_h))
net_o_test = output_layer_weights@out_h + 0.60
out_o_test = 1 / (1 + np.exp(-net_o))
print('target',outputs)
print('output',out_o_test)