基于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 相关文章推荐
Python3.2模拟实现webqq登录
Feb 15 Python
Python正则表达式完全指南
May 25 Python
pandas数据分组和聚合操作方法
Apr 11 Python
django session完成状态保持的方法
Nov 27 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
python 堆和优先队列的使用详解
Mar 05 Python
Python面向对象程序设计构造函数和析构函数用法分析
Apr 12 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
Feb 18 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
python实现socket简单通信的示例代码
Apr 13 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 Python
Python中的xlrd模块使用整理
Jun 15 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
用PHP的ob_start();控制您的浏览器cache!
2006/11/25 PHP
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
php 日期时间处理函数小结
2009/12/18 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
使用PHP下载CSS文件中的图片的代码
2013/09/24 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
Python如何获取文件路径/目录
2020/09/22 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
4s客服专员岗位职责
2013/12/01 职场文书
最新的咖啡店创业计划书
2013/12/30 职场文书
预备党员党课思想汇报
2014/01/13 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
党委班子对照检查材料
2014/08/19 职场文书
父亲节活动策划方案
2014/08/24 职场文书
农业生产宣传标语
2014/10/08 职场文书
学习党章的体会
2014/11/07 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
高二数学教学反思
2016/02/18 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python
详解Vue3使用axios的配置教程
2022/04/29 Vue.js