基于python的BP神经网络及异或实现过程解析


Posted in Python onSeptember 30, 2019

BP神经网络是最简单的神经网络模型了,三层能够模拟非线性函数效果。

基于python的BP神经网络及异或实现过程解析

难点:

  • 如何确定初始化参数?
  • 如何确定隐含层节点数量?
  • 迭代多少次?如何更快收敛?
  • 如何获得全局最优解?
'''
neural networks 

created on 2019.9.24
author: vince
'''
import math
import logging
import numpy 
import random
import matplotlib.pyplot as plt

'''
neural network 
'''
class NeuralNetwork:

 def __init__(self, layer_nums, iter_num = 10000, batch_size = 1):
  self.__ILI = 0;
  self.__HLI = 1;
  self.__OLI = 2;
  self.__TLN = 3;

  if len(layer_nums) != self.__TLN:
   raise Exception("layer_nums length must be 3");

  self.__layer_nums = layer_nums; #array [layer0_num, layer1_num ...layerN_num]
  self.__iter_num = iter_num;
  self.__batch_size = batch_size;
 
 def train(self, X, Y):
  X = numpy.array(X);
  Y = numpy.array(Y);

  self.L = [];
  #initialize parameters
  self.__weight = [];
  self.__bias = [];
  self.__step_len = [];
  for layer_index in range(1, self.__TLN):
   self.__weight.append(numpy.random.rand(self.__layer_nums[layer_index - 1], self.__layer_nums[layer_index]) * 2 - 1.0);
   self.__bias.append(numpy.random.rand(self.__layer_nums[layer_index]) * 2 - 1.0);
   self.__step_len.append(0.3);

  logging.info("bias:%s" % (self.__bias));
  logging.info("weight:%s" % (self.__weight));

  for iter_index in range(self.__iter_num):
   sample_index = random.randint(0, len(X) - 1);
   logging.debug("-----round:%s, select sample %s-----" % (iter_index, sample_index));
   output = self.forward_pass(X[sample_index]);
   g = (-output[2] + Y[sample_index]) * self.activation_drive(output[2]);
   logging.debug("g:%s" % (g));
   for j in range(len(output[1])):
    self.__weight[1][j] += self.__step_len[1] * g * output[1][j];
   self.__bias[1] -= self.__step_len[1] * g;

   e = [];
   for i in range(self.__layer_nums[self.__HLI]):
    e.append(numpy.dot(g, self.__weight[1][i]) * self.activation_drive(output[1][i]));
   e = numpy.array(e);
   logging.debug("e:%s" % (e));
   for j in range(len(output[0])):
    self.__weight[0][j] += self.__step_len[0] * e * output[0][j];
   self.__bias[0] -= self.__step_len[0] * e;

   l = 0;
   for i in range(len(X)):
    predictions = self.forward_pass(X[i])[2];
    l += 0.5 * numpy.sum((predictions - Y[i]) ** 2);
   l /= len(X);
   self.L.append(l);

   logging.debug("bias:%s" % (self.__bias));
   logging.debug("weight:%s" % (self.__weight));
   logging.debug("loss:%s" % (l));
  logging.info("bias:%s" % (self.__bias));
  logging.info("weight:%s" % (self.__weight));
  logging.info("L:%s" % (self.L));
 
 def activation(self, z):
  return (1.0 / (1.0 + numpy.exp(-z)));

 def activation_drive(self, y):
  return y * (1.0 - y);

 def forward_pass(self, x):
  data = numpy.copy(x);
  result = [];
  result.append(data);
  for layer_index in range(self.__TLN - 1):
   data = self.activation(numpy.dot(data, self.__weight[layer_index]) - self.__bias[layer_index]);
   result.append(data);
  return numpy.array(result);

 def predict(self, x):
  return self.forward_pass(x)[self.__OLI];


def main():
 logging.basicConfig(level = logging.INFO,
   format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
   datefmt = '%a, %d %b %Y %H:%M:%S');
   
 logging.info("trainning begin.");
 nn = NeuralNetwork([2, 2, 1]);
 X = numpy.array([[0, 0], [1, 0], [1, 1], [0, 1]]);
 Y = numpy.array([0, 1, 0, 1]);
 nn.train(X, Y);

 logging.info("trainning end. predict begin.");
 for x in X:
  print(x, nn.predict(x));

 plt.plot(nn.L)
 plt.show();

if __name__ == "__main__":
 main();

具体收敛效果

基于python的BP神经网络及异或实现过程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python正则表达式re模块详解
Jun 25 Python
Python中subprocess模块用法实例详解
May 20 Python
Python SQLite3简介
Feb 22 Python
Python中按值来获取指定的键
Mar 04 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Django如何实现密码错误报错提醒
Sep 04 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 Python
Python中npy和mat文件的保存与读取
Apr 24 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 #Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 #Python
Python3 合并二叉树的实现
Sep 30 #Python
自适应线性神经网络Adaline的python实现详解
Sep 30 #Python
softmax及python实现过程解析
Sep 30 #Python
python根据时间获取周数代码实例
Sep 30 #Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 #Python
You might like
星际RPG字典
2020/03/04 星际争霸
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
JS 常用校验函数
2009/03/26 Javascript
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
详解使用Python处理文件目录的相关方法
2015/10/16 Python
用pandas中的DataFrame时选取行或列的方法
2018/07/11 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
python实现双色球随机选号
2020/01/01 Python
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
顶岗实习计划书
2014/01/10 职场文书
便利店促销方案
2014/02/20 职场文书
美术毕业生求职信
2014/02/25 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
社区灵活就业证明
2014/11/03 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
Java中try catch处理异常示例
2021/12/06 Java/Android
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang