神经网络(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列出一个文件夹及其子目录的所有文件
Jun 30 Python
Python入门_浅谈数据结构的4种基本类型
May 16 Python
python 数据的清理行为实例详解
Jul 12 Python
Python单元和文档测试实例详解
Apr 11 Python
python flask框架实现传数据到js的方法分析
Jun 11 Python
Django url,从一个页面调到另个页面的方法
Aug 21 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
python 如何在测试中使用 Mock
Mar 01 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 jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
JS中的作用域链
2017/03/01 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
Python中__name__的使用实例
2015/04/14 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
django模板结构优化的方法
2019/02/28 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
用django设置session过期时间的方法解析
2019/08/05 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
高中自我鉴定
2013/12/20 职场文书
骨干教师培训方案
2014/05/06 职场文书
中学教师师德承诺书
2014/05/23 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
领导班子整改方案
2014/10/25 职场文书
初中中等生评语
2014/12/29 职场文书
团结友爱主题班会
2015/08/13 职场文书
初二数学教学反思
2016/02/17 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis