python 实现BP算法

 图片引用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)

 

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值