神经网络(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 相关文章推荐
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
利用python获取Ping结果示例代码
Jul 06 Python
AI人工智能 Python实现人机对话
Nov 13 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
Jan 08 Python
对django 模型 unique together的示例讲解
Aug 06 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
AngularJS ng-controller 指令简单实例
2016/08/01 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
JS实现简单日历特效
2020/01/03 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
python实现列表的排序方法分享
2019/07/01 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
2019/08/09 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
Python求解排列中的逆序数个数实例
2020/05/03 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
Farah官方网站:男士服装及配件
2019/11/01 全球购物
荷兰家电销售网站:Welhof
2020/12/08 全球购物
社区文化建设方案
2014/05/02 职场文书
2014教师党员自我评议(5篇)
2014/09/20 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
终止劳动合同通知书
2015/04/16 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
毕业欢送会致辞
2015/07/29 职场文书
PyTorch中的torch.cat简单介绍
2022/03/17 Python