神经网络(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 相关文章推荐
JSON Web Tokens的实现原理
Apr 02 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
把pandas转换int型为str型的方法
Jan 29 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
python根据txt文本批量创建文件夹
Dec 08 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
pytorch 预训练层的使用方法
Aug 20 Python
python文字转语音的实例代码分析
Nov 12 Python
Python configparser模块配置文件过程解析
Mar 03 Python
基于python爬取有道翻译过程图解
Mar 31 Python
python 用struct模块解决黏包问题
Nov 07 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
Jun 08 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
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
jquery使用经验小结
2015/05/20 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
python实现决策树
2017/12/21 Python
python如何实现内容写在图片上
2018/03/23 Python
Numpy数组的保存与读取方法
2018/04/04 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
网络信息管理员岗位职责
2014/01/05 职场文书
手机促销活动方案
2014/02/05 职场文书
公司会计岗位职责
2014/02/13 职场文书
基层党组织公开承诺书
2014/03/28 职场文书
提拔干部考察材料
2014/05/26 职场文书
总经理任命书范本
2014/06/05 职场文书
公司活动总结怎么写
2014/06/25 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
青年文明号申报材料
2014/12/23 职场文书
高中体育课教学反思
2016/02/16 职场文书
Win11快速关闭所有广告推荐
2022/04/19 数码科技