反向传播神经网络的简单实现
2018-01-28 17:08
453 查看
先把代码放这里,后面再写字
# coding=utf-8
# 反向传播神经网络
import numpy as np
import math
import sys
np.random.seed(0)
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
def dsigmoid(x):
return x * (1 - x)
class NN:
def __init__(self, ni, nh, no):
"""
ni: num of input neural
nh: num of hiden neural
no: num of output neural
"""
self.wi = np.random.uniform(-0.2, 0.2, size = (ni + 1, nh))
self.wo = np.random.uniform(-2.0, 2.0, size = (nh, no))
def run_nn(self, inputs):
self.ai = inputs.copy()
input_with_b = np.column_stack((self.ai, np.ones(self.ai.shape[0])))
# 计算隐藏层的输出
self.ah = np.array(map(sigmoid, np.dot(input_with_b, self.wi)))
# 计算输出层的输出
self.ao = np.array(map(sigmoid, np.dot(self.ah, self.wo)))
return self.ao
def back_propagate(self, y, learn_rate):
# 计算输出层delta
err = y - self.ao
output_delta = err * np.array(map(dsigmoid, self.ao))
# 更新输出层权值
change = np.dot(self.ah.T, output_delta)
self.wo += change * learn_rate
# 计算隐藏层delta
err = np.dot(output_delta, self.wo.T)
hidden_delta = err * dsigmoid(self.ah)
# 更新输入层权值
input_with_b = np.column_stack((self.ai, np.ones(self.ai.shape[0])))
change = np.dot(input_with_b.T, hidden_delta)
self.wi += change * learn_rate
# 计算误差平方和
err = 0.5 * (y - self.ao) ** 2
return err
def test(self, inputs, outputs):
for i in range(0, inputs.shape[0]):
print self.run_nn(inputs[i:i+1]), outputs[i:i+1]
def train(self, inputs, outputs, max_iterations = 1000, learn_rate = 0.5):
for n in range(max_iterations):
for i in range(0, inputs.shape[0]):
self.run_nn(inputs[i:i+1])
err = self.back_propagate(outputs[i:i+1], learn_rate)
if n % 50 == 0:
print 'err: ', err
self.test(inputs, outputs)
def main():
x = np.array ([
[0, 0],
[0, 1],
[1, 0],
[1, 1],
])
y = np.array ([
[1],
[1],
[1],
[0],
])
nn = NN(2, 2, 1)
nn.train(x, y)
if __name__ == '__main__':
main()
# coding=utf-8
# 反向传播神经网络
import numpy as np
import math
import sys
np.random.seed(0)
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
def dsigmoid(x):
return x * (1 - x)
class NN:
def __init__(self, ni, nh, no):
"""
ni: num of input neural
nh: num of hiden neural
no: num of output neural
"""
self.wi = np.random.uniform(-0.2, 0.2, size = (ni + 1, nh))
self.wo = np.random.uniform(-2.0, 2.0, size = (nh, no))
def run_nn(self, inputs):
self.ai = inputs.copy()
input_with_b = np.column_stack((self.ai, np.ones(self.ai.shape[0])))
# 计算隐藏层的输出
self.ah = np.array(map(sigmoid, np.dot(input_with_b, self.wi)))
# 计算输出层的输出
self.ao = np.array(map(sigmoid, np.dot(self.ah, self.wo)))
return self.ao
def back_propagate(self, y, learn_rate):
# 计算输出层delta
err = y - self.ao
output_delta = err * np.array(map(dsigmoid, self.ao))
# 更新输出层权值
change = np.dot(self.ah.T, output_delta)
self.wo += change * learn_rate
# 计算隐藏层delta
err = np.dot(output_delta, self.wo.T)
hidden_delta = err * dsigmoid(self.ah)
# 更新输入层权值
input_with_b = np.column_stack((self.ai, np.ones(self.ai.shape[0])))
change = np.dot(input_with_b.T, hidden_delta)
self.wi += change * learn_rate
# 计算误差平方和
err = 0.5 * (y - self.ao) ** 2
return err
def test(self, inputs, outputs):
for i in range(0, inputs.shape[0]):
print self.run_nn(inputs[i:i+1]), outputs[i:i+1]
def train(self, inputs, outputs, max_iterations = 1000, learn_rate = 0.5):
for n in range(max_iterations):
for i in range(0, inputs.shape[0]):
self.run_nn(inputs[i:i+1])
err = self.back_propagate(outputs[i:i+1], learn_rate)
if n % 50 == 0:
print 'err: ', err
self.test(inputs, outputs)
def main():
x = np.array ([
[0, 0],
[0, 1],
[1, 0],
[1, 1],
])
y = np.array ([
[1],
[1],
[1],
[0],
])
nn = NN(2, 2, 1)
nn.train(x, y)
if __name__ == '__main__':
main()
相关文章推荐
- 简单的前向传播模型实现(四层神经网络),菜鸟用于交流
- C++从零实现深度神经网络之二——前向传播和反向传播
- 神经网络学习(四)反向(BP)传播算法(2)-Matlab实现
- 深度学习基础(二):简单神经网络,后向传播算法及实现
- 神经网络中的反向传播的推导和python实现
- 深度学习笔记(二):简单神经网络,后向传播算法及实现
- Python神经网络代码实现流程(三):反向传播与梯度下降
- 神经网络中的反向传播法算法推导及matlab代码实现
- [置顶] numpy实现简单的二层网络------前向和反向传播
- 机器学习之实现简单的神经网络
- 用JS实现简单的神经网络算法
- 神经网络反向传播
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- 十一行Python代码实现一个误差逆传播(BP)神经网络
- 神经网络学习笔记-03-循环神经网络-反向传播计算公式的证明
- 三层神经网络简单实现(Python版)
- 小白学习机器学习---第五章:神经网络简单模型python实现
- 神经网络反向传播时的梯度
- 神经网络BP的简单实现
- 机器学习-实现简单神经网络+自适应神经网络