基于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服务器与android客户端socket通信实例
Nov 12 Python
Python获取服务器信息的最简单实现方法
Mar 05 Python
Python常用算法学习基础教程
Apr 13 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
Django如何配置mysql数据库
May 04 Python
Python3中关于cookie的创建与保存
Oct 21 Python
解决Python运行文件出现out of memory框的问题
Dec 03 Python
详解Python3 pandas.merge用法
Sep 05 Python
基于Django集成CAS实现流程详解
Nov 28 Python
Python使用Pygame绘制时钟
Nov 29 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
Python Selenium操作Cookie的实例方法
Feb 28 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
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
python实现文件分组复制到不同目录的例子
2014/06/04 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
后备干部考察材料
2014/02/12 职场文书
写字楼租赁意向书
2014/07/30 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书
golang定时器
2022/04/14 Golang