基于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实现计算资源图标crc值的方法
Oct 05 Python
Python中的作用域规则详解
Jan 30 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
对Python中的@classmethod用法详解
Apr 21 Python
Django 迁移、操作数据库的方法
Aug 02 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python生成器实现简单"生产者消费者"模型代码实例
Mar 27 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
什么是Python中的匿名函数
Jun 02 Python
python如何输出反斜杠
Jun 18 Python
详解Python生成器和基于生成器的协程
Jun 03 Python
python面向对象版学生信息管理系统
Jun 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
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
AngularJS中的拦截器实例详解
2017/04/07 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
Python中几种操作字符串的方法的介绍
2015/04/09 Python
Python线程指南详细介绍
2017/01/05 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
django框架使用方法详解
2019/07/18 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
django 多数据库及分库实现方式
2020/04/01 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
css3 transform属性详解
2014/09/30 HTML / CSS
初入社会应届生求职信
2013/11/18 职场文书
经典演讲稿范文
2013/12/30 职场文书
人力资源求职信
2014/05/25 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
培训心得体会怎么写
2016/01/25 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
欧元符号 €
2022/02/17 杂记