python构建深度神经网络(DNN)


Posted in Python onMarch 10, 2018

本文学习Neural Networks and Deep Learning 在线免费书籍,用python构建神经网络识别手写体的一个总结。

代码主要包括两三部分:

1)、数据调用和预处理

2)、神经网络类构建和方法建立

3)、代码测试文件

1)数据调用:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# @Time  : 2017-03-12 15:11 
# @Author : CC 
# @File  : net_load_data.py 
# @Software: PyCharm Community Edition 
 
from numpy import * 
import numpy as np 
import cPickle 
def load_data(): 
  """载入解压后的数据,并读取""" 
  with open('data/mnist_pkl/mnist.pkl','rb') as f: 
    try: 
      train_data,validation_data,test_data = cPickle.load(f) 
      print " the file open sucessfully" 
      # print train_data[0].shape #(50000,784) 
      # print train_data[1].shape  #(50000,) 
      return (train_data,validation_data,test_data) 
    except EOFError: 
      print 'the file open error' 
      return None 
 
def data_transform(): 
  """将数据转化为计算格式""" 
  t_d,va_d,te_d = load_data() 
  # print t_d[0].shape # (50000,784) 
  # print te_d[0].shape # (10000,784) 
  # print va_d[0].shape # (10000,784) 
  # n1 = [np.reshape(x,784,1) for x in t_d[0]] # 将5万个数据分别逐个取出化成(784,1),逐个排列 
  n = [np.reshape(x, (784, 1)) for x in t_d[0]] # 将5万个数据分别逐个取出化成(784,1),逐个排列 
  # print 'n1',n1[0].shape 
  # print 'n',n[0].shape 
  m = [vectors(y) for y in t_d[1]] # 将5万标签(50000,1)化为(10,50000) 
  train_data = zip(n,m) # 将数据与标签打包成元组形式 
  n = [np.reshape(x, (784, 1)) for x in va_d[0]] # 将5万个数据分别逐个取出化成(784,1),排列 
  validation_data = zip(n,va_d[1])  # 没有将标签数据矢量化 
  n = [np.reshape(x, (784, 1)) for x in te_d[0]] # 将5万个数据分别逐个取出化成(784,1),排列 
  test_data = zip(n, te_d[1]) # 没有将标签数据矢量化 
  # print train_data[0][0].shape #(784,) 
  # print "len(train_data[0])",len(train_data[0]) #2 
  # print "len(train_data[100])",len(train_data[100]) #2 
  # print "len(train_data[0][0])", len(train_data[0][0]) #784 
  # print "train_data[0][0].shape", train_data[0][0].shape #(784,1) 
  # print "len(train_data)", len(train_data) #50000 
  # print train_data[0][1].shape #(10,1) 
  # print test_data[0][1] # 7 
  return (train_data,validation_data,test_data) 
def vectors(y): 
  """赋予标签""" 
  label = np.zeros((10,1)) 
  label[y] = 1.0 #浮点计算 
  return label

2)网络构建

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# @Time  : 2017-03-12 16:07 
# @Author : CC 
# @File  : net_network.py 
 
import numpy as np 
import random 
class Network(object):  #默认为基类?用于继承:print isinstance(network,object) 
  def __init__(self,sizes): 
    self.num_layers = len(sizes) 
    self.sizes = sizes 
    # print 'num_layers', self.num_layers 
    self.weight = [np.random.randn(a1, a2) for (a1, a2) in zip(sizes[1:], sizes[:-1])] #产生一个个数组 
    self.bias = [np.random.randn(a3,1) for a3 in sizes[1:]] 
    # print self.weight[0].shape #(20,10) 
 
  def SGD(self,train_data,min_batch_size,epoches,eta,test_data=False): 
    """ 1) 打乱样本,将训练数据划分成小批次 
      2)计算出反向传播梯度 
      3) 获得权重更新""" 
    if test_data: n_test = len(test_data) 
    n = len(train_data)  #50000 
    random.shuffle(train_data) # 打乱 
    min_batches = [train_data[k:k+min_batch_size] for k in xrange(0,n,min_batch_size)] #提取批次数据 
    for k in xrange(0,epoches):  #利用更新后的权值继续更新 
      random.shuffle(train_data) # 打乱 
      for min_batch in min_batches: #逐个传入,效率很低 
        self.updata_parameter(min_batch,eta) 
      if test_data: 
        num = self.evaluate(test_data) 
        print "the {0}th epoches: {1}/{2}".format(k,num,len(test_data)) 
      else: 
        print 'epoches {0} completed'.format(k) 
 
  def forward(self,x): 
    """获得各层激活值""" 
    for w,b in zip(self.weight,self.bias): 
      x = sigmoid(np.dot(w, x)+b) 
    return x 
 
  def updata_parameter(self,min_batch,eta): 
    """1) 反向传播计算每个样本梯度值 
      2) 累加每个批次样本的梯度值 
      3) 权值更新""" 
    ndeltab = [np.zeros(b.shape) for b in self.bias] 
    ndeltaw = [np.zeros(w.shape) for w in self.weight] 
    for x,y in min_batch: 
      deltab,deltaw = self.backprop(x,y) 
      ndeltab = [nb +db for nb,db in zip(ndeltab,deltab)] 
      ndeltaw = [nw + dw for nw,dw in zip(ndeltaw,deltaw)] 
    self.bias = [b - eta * ndb/len(min_batch) for ndb,b in zip(ndeltab,self.bias)] 
    self.weight = [w - eta * ndw/len(min_batch) for ndw,w in zip(ndeltaw,self.weight)] 
 
 
  def backprop(self,x,y): 
    """执行前向计算,再进行反向传播,返回deltaw,deltab""" 
    # [w for w in self.weight] 
    # print 'len',len(w) 
    # print "self.weight",self.weight[0].shape 
    # print w[0].shape 
    # print w[1].shape 
    # print w.shape 
    activation = x 
    activations = [x] 
    zs = [] 
    # feedforward 
    for w, b in zip(self.weight, self.bias): 
      # print w.shape,activation.shape,b.shape 
      z = np.dot(w, activation) +b 
      zs.append(z)  #用于计算f(z)导数 
      activation = sigmoid(z) 
      # print 'activation',activation.shape 
      activations.append(activation) # 每层的输出结果 
    delta = self.top_subtract(activations[-1],y) * dsigmoid(zs[-1]) #最后一层的delta,np.array乘,相同维度乘 
    deltaw = [np.zeros(w1.shape) for w1 in self.weight] #每一次将获得的值作为列表形式赋给deltaw 
    deltab = [np.zeros(b1.shape) for b1 in self.bias] 
    # print 'deltab[0]',deltab[-1].shape 
    deltab[-1] = delta 
    deltaw[-1] = np.dot(delta,activations[-2].transpose()) 
    for k in xrange(2,self.num_layers): 
      delta = np.dot(self.weight[-k+1].transpose(),delta) * dsigmoid(zs[-k]) 
      deltab[-k] = delta 
      deltaw[-k] = np.dot(delta,activations[-k-1].transpose()) 
    return (deltab,deltaw) 
 
  def evaluate(self,test_data): 
    """评估验证集和测试集的精度,标签直接一个数作为比较""" 
    z = [(np.argmax(self.forward(x)),y) for x,y in test_data] 
    zs = np.sum(int(a == b) for a,b in z) 
    # zk = sum(int(a == b) for a,b in z) 
    # print "zs/zk:",zs,zk 
    return zs 
 
  def top_subtract(self,x,y): 
    return (x - y) 
 
def sigmoid(x): 
  return 1.0/(1.0+np.exp(-x)) 
 
def dsigmoid(x): 
  z = sigmoid(x) 
  return z*(1-z)

3)网络测试

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# @Time  : 2017-03-12 15:24 
# @Author : CC 
# @File  : net_test.py 
 
import net_load_data 
# net_load_data.load_data() 
train_data,validation_data,test_data = net_load_data.data_transform() 
 
import net_network as net 
net1 = net.Network([784,30,10]) 
min_batch_size = 10 
eta = 3.0 
epoches = 30 
net1.SGD(train_data,min_batch_size,epoches,eta,test_data) 
print "complete"

4)结果

the 9th epoches: 9405/10000 
the 10th epoches: 9420/10000 
the 11th epoches: 9385/10000 
the 12th epoches: 9404/10000 
the 13th epoches: 9398/10000 
the 14th epoches: 9406/10000 
the 15th epoches: 9396/10000 
the 16th epoches: 9413/10000 
the 17th epoches: 9405/10000 
the 18th epoches: 9425/10000 
the 19th epoches: 9420/10000

总体来说这本书的实例,用来熟悉python和神经网络非常好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作日期和时间的方法
Mar 11 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Python封装shell命令实例分析
May 05 Python
Python批量重命名同一文件夹下文件的方法
May 25 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
python实现信号时域统计特征提取代码
Feb 26 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
python numpy库np.percentile用法说明
Jun 08 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
用Python简陋模拟n阶魔方
Apr 17 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 Python
Python使用numpy实现BP神经网络
Mar 10 #Python
python实现日常记账本小程序
Mar 10 #Python
python实现简单神经网络算法
Mar 10 #Python
TensorFlow saver指定变量的存取
Mar 10 #Python
TensorFLow用Saver保存和恢复变量
Mar 10 #Python
tensorflow创建变量以及根据名称查找变量
Mar 10 #Python
Python2中文处理纪要的实现方法
Mar 10 #Python
You might like
PHP 可阅读随机字符串代码
2010/05/26 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
深入浅析Python传值与传址
2018/07/10 Python
python用插值法绘制平滑曲线
2021/02/19 Python
pywinauto自动化操作记事本
2019/08/26 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
水果花束:Fruit Bouquets
2017/12/20 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
市场部经理岗位职责
2014/04/10 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
新娘婚礼致辞
2015/07/27 职场文书
争做文明公民倡议书
2019/06/24 职场文书
oracle索引总结
2021/09/25 Oracle
Python制作表白爱心合集
2022/01/22 Python