神经网络(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中的自定义函数学习笔记
Sep 23 Python
Python带动态参数功能的sqlite工具类
May 26 Python
python发送告警邮件脚本
Sep 17 Python
django如何通过类视图使用装饰器
Jul 24 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
pytorch之ImageFolder使用详解
Jan 06 Python
Python版中国省市经纬度
Feb 11 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
Python时间操作之pytz模块使用详解
Jun 14 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-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
总结对比php中的多种序列化
2016/08/28 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
微信跳一跳自动运行python脚本
2018/01/08 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
一套中级Java程序员笔试题
2015/01/14 面试题
期末学生评语大全
2014/04/24 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
师德师风整改措施
2014/10/24 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
大二学年个人总结
2015/03/03 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android