神经网络(BP)算法Python实现及应用


Posted in Python onApril 16, 2018

本文实例为大家分享了Python实现神经网络算法及应用的具体代码,供大家参考,具体内容如下

首先用Python实现简单地神经网络算法:

import numpy as np


# 定义tanh函数
def tanh(x):
  return np.tanh(x)


# tanh函数的导数
def tan_deriv(x):
  return 1.0 - np.tanh(x) * np.tan(x)


# sigmoid函数
def logistic(x):
  return 1 / (1 + np.exp(-x))


# sigmoid函数的导数
def logistic_derivative(x):
  return logistic(x) * (1 - logistic(x))


class NeuralNetwork:
  def __init__(self, layers, activation='tanh'):
    """
    神经网络算法构造函数
    :param layers: 神经元层数
    :param activation: 使用的函数(默认tanh函数)
    :return:none
    """
    if activation == 'logistic':
      self.activation = logistic
      self.activation_deriv = logistic_derivative
    elif activation == 'tanh':
      self.activation = tanh
      self.activation_deriv = tan_deriv

    # 权重列表
    self.weights = []
    # 初始化权重(随机)
    for i in range(1, len(layers) - 1):
      self.weights.append((2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)
      self.weights.append((2 * np.random.random((layers[i] + 1, layers[i + 1])) - 1) * 0.25)

  def fit(self, X, y, learning_rate=0.2, epochs=10000):
    """
    训练神经网络
    :param X: 数据集(通常是二维)
    :param y: 分类标记
    :param learning_rate: 学习率(默认0.2)
    :param epochs: 训练次数(最大循环次数,默认10000)
    :return: none
    """
    # 确保数据集是二维的
    X = np.atleast_2d(X)

    temp = np.ones([X.shape[0], X.shape[1] + 1])
    temp[:, 0: -1] = X
    X = temp
    y = np.array(y)

    for k in range(epochs):
      # 随机抽取X的一行
      i = np.random.randint(X.shape[0])
      # 用随机抽取的这一组数据对神经网络更新
      a = [X[i]]
      # 正向更新
      for l in range(len(self.weights)):
        a.append(self.activation(np.dot(a[l], self.weights[l])))
      error = y[i] - a[-1]
      deltas = [error * self.activation_deriv(a[-1])]

      # 反向更新
      for l in range(len(a) - 2, 0, -1):
        deltas.append(deltas[-1].dot(self.weights[l].T) * self.activation_deriv(a[l]))
        deltas.reverse()
      for i in range(len(self.weights)):
        layer = np.atleast_2d(a[i])
        delta = np.atleast_2d(deltas[i])
        self.weights[i] += learning_rate * layer.T.dot(delta)

  def predict(self, x):
    x = np.array(x)
    temp = np.ones(x.shape[0] + 1)
    temp[0:-1] = x
    a = temp
    for l in range(0, len(self.weights)):
      a = self.activation(np.dot(a, self.weights[l]))
    return a

使用自己定义的神经网络算法实现一些简单的功能:

 小案例:

X:                  Y
0 0                 0
0 1                 1
1 0                 1
1 1                 0

from NN.NeuralNetwork import NeuralNetwork
import numpy as np

nn = NeuralNetwork([2, 2, 1], 'tanh')
temp = [[0, 0], [0, 1], [1, 0], [1, 1]]
X = np.array(temp)
y = np.array([0, 1, 1, 0])
nn.fit(X, y)
for i in temp:
  print(i, nn.predict(i))

神经网络(BP)算法Python实现及应用

发现结果基本机制,无限接近0或者无限接近1 

第二个例子:识别图片中的数字

导入数据:

from sklearn.datasets import load_digits
import pylab as pl

digits = load_digits()
print(digits.data.shape)
pl.gray()
pl.matshow(digits.images[0])
pl.show()

观察下:大小:(1797, 64)

数字0

神经网络(BP)算法Python实现及应用

接下来的代码是识别它们:

import numpy as np
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.preprocessing import LabelBinarizer
from NN.NeuralNetwork import NeuralNetwork
from sklearn.cross_validation import train_test_split

# 加载数据集
digits = load_digits()
X = digits.data
y = digits.target
# 处理数据,使得数据处于0,1之间,满足神经网络算法的要求
X -= X.min()
X /= X.max()

# 层数:
# 输出层10个数字
# 输入层64因为图片是8*8的,64像素
# 隐藏层假设100
nn = NeuralNetwork([64, 100, 10], 'logistic')
# 分隔训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y)

# 转化成sklearn需要的二维数据类型
labels_train = LabelBinarizer().fit_transform(y_train)
labels_test = LabelBinarizer().fit_transform(y_test)
print("start fitting")
# 训练3000次
nn.fit(X_train, labels_train, epochs=3000)
predictions = []
for i in range(X_test.shape[0]):
  o = nn.predict(X_test[i])
  # np.argmax:第几个数对应最大概率值
  predictions.append(np.argmax(o))

# 打印预测相关信息
print(confusion_matrix(y_test, predictions))
print(classification_report(y_test, predictions))

结果:

矩阵对角线代表预测正确的数量,发现正确率很多

神经网络(BP)算法Python实现及应用

这张表更直观地显示出预测正确率:

共450个案例,成功率94%

神经网络(BP)算法Python实现及应用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python urlopen()函数 示例分享
Jun 12 Python
Python通过websocket与js客户端通信示例分析
Jun 25 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
Django之无名分组和有名分组的实现
Apr 16 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
如何使用Python抓取网页tag操作
Feb 14 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
python读取视频流提取视频帧的两种方法
Oct 22 #Python
python读取和保存视频文件
Apr 16 #Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 #Python
python2.7实现FTP文件下载功能
Apr 15 #Python
python实现多线程网页下载器
Apr 15 #Python
Python实现定时精度可调节的定时器
Apr 15 #Python
Python编写一个优美的下载器
Apr 15 #Python
You might like
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
pygame实现弹球游戏
2020/04/14 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
党委干部批评与自我批评发言稿
2014/09/28 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
这样写python注释让代码更加的优雅
2021/06/02 Python
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis