神经网络(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 自动安装 Rising 杀毒软件
Apr 24 Python
Python做文本按行去重的实现方法
Oct 19 Python
python一键去抖音视频水印工具
Sep 14 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
Python enumerate函数功能与用法示例
Mar 01 Python
python调用webservice接口的实现
Jul 12 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 Python
用pandas划分数据集实现训练集和测试集
Jul 20 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
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
JavaScript 基础篇(一)
2012/03/30 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
详解vuex的简单使用
2018/03/12 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
element form 校验数组每一项实例代码
2019/10/10 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
Python批量修改文件后缀的方法
2014/01/26 Python
Python中用altzone()方法处理时区的教程
2015/05/22 Python
python爬虫之遍历单个域名
2019/11/20 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
师生聚会感言
2014/01/26 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
机关搬迁方案
2014/05/18 职场文书
陕西导游词
2015/02/04 职场文书
个人党性分析总结
2015/03/05 职场文书
车间质检员岗位职责
2015/04/08 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书