基于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使用urllib模块开发的多线程豆瓣小站mp3下载器
Jan 16 Python
python实现机器人行走效果
Jan 29 Python
python去除扩展名的实例讲解
Apr 23 Python
numpy返回array中元素的index方法
Jun 27 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
python 文件查找及内容匹配方法
Oct 25 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
Python hmac模块使用实例解析
Dec 24 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
Feb 23 Python
Python实现打包成库供别的模块调用
Jul 13 Python
使用AJAX和Django获取数据的方法实例
Oct 25 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
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
javaScript中"=="和"==="的区别详解
2018/03/16 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
详细解读Python中的__init__()方法
2015/05/02 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python实现批量压缩图片
2018/01/25 Python
python模块常用用法实例详解
2019/10/17 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
教师自我评价范例
2013/09/24 职场文书
医院后勤自我鉴定
2013/10/13 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
人力资源总监工作说明
2014/03/03 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
银行求职信范文
2014/05/26 职场文书
标准毕业生自荐信
2014/06/24 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
大学生受助感言
2015/08/01 职场文书
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python
vue修饰符.capture和.self的区别
2022/04/22 Vue.js