基于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函数缺省值与引用学习笔记分享
Feb 10 Python
Python psutil模块简单使用实例
Apr 28 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
python中的Elasticsearch操作汇总
Oct 30 Python
python对象转字典的两种实现方式示例
Nov 07 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
Python常见反爬虫机制解决方案
Jun 01 Python
Python unittest基本使用方法代码实例
Jun 29 Python
python中加背景音乐如何操作
Jul 19 Python
Python pickle模块常用方法代码实例
Oct 10 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 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中取得文件的后缀名?
2012/02/20 PHP
JS焦点图切换,上下翻转
2011/05/12 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
Vue数据双向绑定的深入探究
2018/11/27 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
python实现简单flappy bird
2018/12/24 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
工业设计专业个人求职信范文
2013/12/28 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
贷款收入证明范本
2015/06/12 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL