基于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中多线程thread与threading的实现方法
Aug 18 Python
python的即时标记项目练习笔记
Sep 18 Python
python二分查找算法的递归实现方法
May 12 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
Python简单实现词云图代码及步骤解析
Jun 04 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
Python多线程学习资料
2012/12/19 Python
python文件比较示例分享
2014/01/10 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
django缓存配置的几种方法详解
2018/07/16 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
民用住房租房协议书
2014/10/29 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
诉讼和解协议书
2016/03/23 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL