Python实现的NN神经网络算法完整示例


Posted in Python onJune 19, 2018

本文实例讲述了Python实现的NN神经网络算法。分享给大家供大家参考,具体如下:

参考自Github开源代码:https://github.com/dennybritz/nn-from-scratch

运行环境

  • Pyhton3
  • numpy(科学计算包)
  • matplotlib(画图所需,不画图可不必)
  • sklearn(人工智能包,生成数据使用)

计算过程

Python实现的NN神经网络算法完整示例

输入样例

none

代码实现

# -*- coding:utf-8 -*-
#!python3
__author__ = 'Wsine'
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model
import matplotlib.pyplot as plt
import matplotlib
import operator
import time
def createData(dim=200, cnoise=0.20):
  """
  输出:数据集, 对应的类别标签
  描述:生成一个数据集和对应的类别标签
  """
  np.random.seed(0)
  X, y = sklearn.datasets.make_moons(dim, noise=cnoise)
  plt.scatter(X[:, 0], X[:, 1], s=40, c=y, cmap=plt.cm.Spectral)
  #plt.show()
  return X, y
def plot_decision_boundary(pred_func, X, y):
  """
  输入:边界函数, 数据集, 类别标签
  描述:绘制决策边界(画图用)
  """
  # 设置最小最大值, 加上一点外边界
  x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
  y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
  h = 0.01
  # 根据最小最大值和一个网格距离生成整个网格
  xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
  # 对整个网格预测边界值
  Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
  Z = Z.reshape(xx.shape)
  # 绘制边界和数据集的点
  plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
  plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
def calculate_loss(model, X, y):
  """
  输入:训练模型, 数据集, 类别标签
  输出:误判的概率
  描述:计算整个模型的性能
  """
  W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']
  # 正向传播来计算预测的分类值
  z1 = X.dot(W1) + b1
  a1 = np.tanh(z1)
  z2 = a1.dot(W2) + b2
  exp_scores = np.exp(z2)
  probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
  # 计算误判概率
  corect_logprobs = -np.log(probs[range(num_examples), y])
  data_loss = np.sum(corect_logprobs)
  # 加入正则项修正错误(可选)
  data_loss += reg_lambda/2 * (np.sum(np.square(W1)) + np.sum(np.square(W2)))
  return 1./num_examples * data_loss
def predict(model, x):
  """
  输入:训练模型, 预测向量
  输出:判决类别
  描述:预测类别属于(0 or 1)
  """
  W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']
  # 正向传播计算
  z1 = x.dot(W1) + b1
  a1 = np.tanh(z1)
  z2 = a1.dot(W2) + b2
  exp_scores = np.exp(z2)
  probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
  return np.argmax(probs, axis=1)
def initParameter(X):
  """
  输入:数据集
  描述:初始化神经网络算法的参数
     必须初始化为全局函数!
     这里需要手动设置!
  """
  global num_examples
  num_examples = len(X) # 训练集的大小
  global nn_input_dim
  nn_input_dim = 2 # 输入层维数
  global nn_output_dim
  nn_output_dim = 2 # 输出层维数
  # 梯度下降参数
  global epsilon
  epsilon = 0.01 # 梯度下降学习步长
  global reg_lambda
  reg_lambda = 0.01 # 修正的指数
def build_model(X, y, nn_hdim, num_passes=20000, print_loss=False):
  """
  输入:数据集, 类别标签, 隐藏层层数, 迭代次数, 是否输出误判率
  输出:神经网络模型
  描述:生成一个指定层数的神经网络模型
  """
  # 根据维度随机初始化参数
  np.random.seed(0)
  W1 = np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim)
  b1 = np.zeros((1, nn_hdim))
  W2 = np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim)
  b2 = np.zeros((1, nn_output_dim))
  model = {}
  # 梯度下降
  for i in range(0, num_passes):
    # 正向传播
    z1 = X.dot(W1) + b1
    a1 = np.tanh(z1) # 激活函数使用tanh = (exp(x) - exp(-x)) / (exp(x) + exp(-x))
    z2 = a1.dot(W2) + b2
    exp_scores = np.exp(z2) # 原始归一化
    probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
    # 后向传播
    delta3 = probs
    delta3[range(num_examples), y] -= 1
    dW2 = (a1.T).dot(delta3)
    db2 = np.sum(delta3, axis=0, keepdims=True)
    delta2 = delta3.dot(W2.T) * (1 - np.power(a1, 2))
    dW1 = np.dot(X.T, delta2)
    db1 = np.sum(delta2, axis=0)
    # 加入修正项
    dW2 += reg_lambda * W2
    dW1 += reg_lambda * W1
    # 更新梯度下降参数
    W1 += -epsilon * dW1
    b1 += -epsilon * db1
    W2 += -epsilon * dW2
    b2 += -epsilon * db2
    # 更新模型
    model = { 'W1': W1, 'b1': b1, 'W2': W2, 'b2': b2}
    # 一定迭代次数后输出当前误判率
    if print_loss and i % 1000 == 0:
      print("Loss after iteration %i: %f" % (i, calculate_loss(model, X, y)))
  plot_decision_boundary(lambda x: predict(model, x), X, y)
  plt.title("Decision Boundary for hidden layer size %d" % nn_hdim)
  #plt.show()
  return model
def main():
  dataSet, labels = createData(200, 0.20)
  initParameter(dataSet)
  nnModel = build_model(dataSet, labels, 3, print_loss=False)
  print("Loss is %f" % calculate_loss(nnModel, dataSet, labels))
if __name__ == '__main__':
  start = time.clock()
  main()
  end = time.clock()
  print('finish all in %s' % str(end - start))
  plt.show()

输出样例

Loss is 0.071316
finish all in 7.221354361552228

Python实现的NN神经网络算法完整示例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之玩转字符串(3)
Sep 14 Python
基于python yield机制的异步操作同步化编程模型
Mar 18 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
python实现求最长回文子串长度
Jan 22 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
Django安装配置mysql的方法步骤
Oct 15 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
Pyqt5实现英文学习词典
Jun 24 Python
Pytorch之卷积层的使用详解
Dec 31 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
python中的二维列表实例详解
Jun 19 #Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 #Python
python3实现SMTP发送邮件详细教程
Jun 19 #Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 #Python
Tensorflow使用tfrecord输入数据格式
Jun 19 #Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 #Python
python如何爬取个性签名
Jun 19 #Python
You might like
php实现mysql数据库备份类
2008/03/20 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
Vue2.0实现购物车功能
2017/06/05 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
python回调函数的使用方法
2014/01/23 Python
python提取内容关键词的方法
2015/03/16 Python
详解python中的json和字典dict
2018/06/22 Python
python实现输入数字的连续加减方法
2018/06/22 Python
Python制作动态字符图的实例
2019/01/27 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
python交互模式基础知识点学习
2020/06/18 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
优秀英语专业毕业生求职信
2013/11/23 职场文书
高中毕业生个人自我鉴定
2013/11/24 职场文书
微博营销计划书
2014/01/10 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
企业总经理岗位职责
2014/02/13 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
公务员政审材料范文
2014/12/23 职场文书
总经理检讨书范文
2015/02/16 职场文书
运动会加油稿30字
2015/07/21 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
实操Python爬取觅知网素材图片示例
2021/11/27 Python
使用refresh_token实现无感刷新页面
2022/04/26 Javascript