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

  

本文学习神经网络和深度学习在线免费书籍,用python构建神经网络识别手写体的一个总结。

  

代码主要包括两三部分:

  

  

  

  

<强> 1)数据调用:

        # !/usr/bin/env python   # - * -编码:utf - 8 - *   # @Time: 2017-03-12十五11   # @Author: CC   # @File: net_load_data.py   # @Software: PyCharm Community Edition      从numpy进口*   进口numpy np   进口cPickle   def load_data ():   ”““载入解压后的数据,并读取“”“   打开(数据/mnist_pkl/mnist.pkl, rb) f:   试一试:   train_data, validation_data test_data=https://www.yisu.com/zixun/cPickle.load (f)   打印文件打开成功”   #打印train_data [0]。形状# (50000、784)   #打印train_data [1]。形状# (50000)   返回(train_data validation_data test_data)   除了EOFError:   打印的文件打开错误   回来没有      def data_transform ():   ”“”将数据转化为计算格式”“   t_d va_d te_d=load_data ()   #打印t_d [0]。形状# (50000、784)   #打印te_d [0]。形状# (10000、784)   #打印va_d [0]。形状# (10000、784)   # n1=[np.reshape (x, 784年,1)x t_d[0]] 5 #将万个数据分别逐个取出化成(784 1),逐个排列   n=(np。重塑(x, (784 1)) x t_d[0]] 5 #将万个数据分别逐个取出化成(784 1),逐个排列   #打印n1, n1 [0] .shape   #打印' n ' n [0] .shape   m=[向量(y)的y t_d[1]] 5 #将万标签(50000 1)化为(50000)   train_data=https://www.yisu.com/zixun/zip (n, m) #将数据与标签打包成元组形式   n=(np。重塑(x, (784 1)) x va_d[0]] 5 #将万个数据分别逐个取出化成(784 1),排列   validation_data=zip (n, va_d[1]) #没有将标签数据矢量化   n=(np。重塑(x, (784 1)) x te_d[0]] 5 #将万个数据分别逐个取出化成(784 1),排列   test_data=zip (n, te_d[1]) #没有将标签数据矢量化   #打印train_data [0] [0]。形状# (784)   #打印”len (train_data [0])”, len (train_data [0]) # 2   #打印”len (train_data [100])”, len (train_data [100]) # 2   #打印”len (train_data [0] [0])”len (train_data [0] [0]) # 784   #打印”train_data [0] [0]。形状”,train_data [0] [0]。形状# (784 1)   #打印”len (train_data)”len (train_data) # 50000   #打印train_data [0] [1]。形状# (10 - 1)   #打印test_data [0] [1] # 7   返回(train_data validation_data test_data)   def向量(y):   ”““赋予标签”“”   1)标签=np.zeros((10日)   标签(y)=1.0 #浮点计算   返回标签      之前      

<强> 2)网络构建

        # !/usr/bin/env python   # - * -编码:utf - 8 - *   # @Time: 2017-03-12阿联酋   # @Author: CC   # @File: net_network.py      进口numpy np   进口随机   类网络(对象):#默认为基类& # 63;用于继承:打印isinstance(网络、对象)   def __init__(自我、大小):   自我。num_layers=len(大小)   自我。尺寸大?#打印num_layers, self.num_layers   自我。重量=[np.random。randn (a1, a2) (a1, a2) zip(大小(1:),大小(:1)))#产生一个个数组   自我。偏见=[np.random.randn (a3, 1)对a3大小[1:]]   #打印self.weight [0]。形状# (20、10)      def SGD(自我、train_data min_batch_size时代,η,test_data=https://www.yisu.com/zixun/False):“””1)打乱样本,将训练数据划分成小批次   2)计算出反向传播梯度   3)获得权重更新”“”   如果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]的k xrange (0 n min_batch_size)] #提取批次数据   时代的k xrange(0): #利用更新后的权值继续更新   random.shuffle (train_data) #打乱   在min_batches min_batch: #逐个传入,效率很低   self.updata_parameter (min_batch“埃塔”)   如果test_data:   num=self.evaluate (test_data)   打印“{0}th时代:{1}/{2}”.format (k, num, len (test_data))   其他:   印刷的时代{0}完成“.format (k)      def向前(自我,x):   ”“”获得各层激活值“”“   对w, b在zip (self.weight self.bias):   x=乙状结肠(np。点(w x) + b)   返回x      def updata_parameter(自我、min_batch eta):   “””1)反向传播计算每个样本梯度值   2)累加每个批次样本的梯度值   3)权值更新”“”   ndeltab=[np.zeros (b.shape) b self.bias)   ndeltaw=[np.zeros (w.shape) w self.weight)   对于x, y min_batch:   deltab deltaw=self.backprop (x, y)   ndeltab=[注+ db nb, db在zip (ndeltab deltab)]   为nw ndeltaw=[nw + dw, dw的zip (ndeltaw deltaw)]   自我。偏见=[b -η* ndb/ndb len (min_batch), b在zip (ndeltab self.bias)]   自我。重量=[w -η* ndw/ndw len (min_batch), w在zip (ndeltaw self.weight)]         def backprop(自我,x, y):   ”““执行前向计算,再进行反向传播,返回deltaw, deltab“”“   # (w w self.weight)   #打印“兰”,len (w)   #打印“self.weight self.weight [0] .shape   #打印w [0] .shape   #打印w [1] .shape   #打印w.shape   激活=x   激活=[x]   z=[]   #前馈   w, b在zip(自我。重量,self.bias):   #打印w.shape, activation.shape b.shape   z=np。点(w,激活)+ b   zs.append (z) #用于计算f (z)导数   激活=乙状结肠(z)   activation.shape #打印“激活”   activations.append(激活)#每层的输出结果   δ=self.top_subtract(激活[1],y) * dsigmoid (z[1]) #最后一层的三角洲,np.array乘,相同维度乘   w1 deltaw=[np.zeros (w1.shape)的自我。重量]#每一次将获得的值作为列表形式赋给deltaw   deltab=[np.zeros (b1.shape) b1 self.bias)   #打印' deltab [0]”, deltab [1] .shape   deltab[1]=δ   deltaw [1]=np.dot(三角洲,激活[2].transpose ())   self.num_layers k在xrange (2):   δ=np.dot (self.weight [- k + 1] .transpose(),δ)* dsigmoid (z (- k))   deltab - k=δ   deltaw (- k)=np.dot(三角洲,激活[1].transpose ())   返回(deltab deltaw)      def评价(自我,test_data):   ””“评估验证集和测试集的精度,标签直接一个数作为比较“”“   z=[(np.argmax (self.forward (x)), y)对x, y test_data)   z=np。sum (int (a==), b z)   # zk=总和(int (a==), b z)   #打印“z/zk:”, z, zk   返回z      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

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