深度学习--手写数字识别<二>--交叉熵损失函数(crossentropycostfunc_第1页
深度学习--手写数字识别<二>--交叉熵损失函数(crossentropycostfunc_第2页
深度学习--手写数字识别<二>--交叉熵损失函数(crossentropycostfunc_第3页
深度学习--手写数字识别<二>--交叉熵损失函数(crossentropycostfunc_第4页
深度学习--手写数字识别<二>--交叉熵损失函数(crossentropycostfunc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深度学习一一手写数字识别二交叉熵损失函数(crossentropycostfunc。使用正确的代价函数避免学习减速交叉熵损失函数crossentropycostfuneton当激活函数采用sigmoid()函数,损失函数使用二次和成本函数时:其中:此时输出趋近于1且变化缓慢,即输出对weights和biases的偏导的值非常小,由weights和biases的更新公式可以看出:此时weights和biases更新速度非常缓慢为解决神经网络学习慢的问题,引入交叉熵损失函数(crossentropycostfunction)可以看出函数值大于等于0且当a=y时,cost=O;因此符合作为costf

2、unction的条件.且可求得:可以看出,此时学习的速度取决于:因此,当偏差越大时学习较快,偏差小时学习较慢最大似然损失函数log-likelyhood:costfunctionsoft函数:softmax是另为一种输出层方程:神经元节点的带权输入Z为:softmax输出为:softmax输出值都是大于等于0,且总和等于1,故可看作是概率分布.log-likelyhoodcostfunction:log-likelyhoodcostfunction即最大似然损失函数.可以看出当输出比较接近目标值时,概率a接近1,对数C接近0,反之概率较小时,对数C比较大.分别对weights和biases求偏

3、导:可以看出此时学习速度同样取决与,因此不存在学习速度慢的问题code2:#!/usr/bin/python#coding:utf-8importjsonimportrandomimportsysimportnumpyasnpimportcPickleimportgzipdefload_data():#读取压缩文件,返回一个描述符ff=gzip.open(./data/mnist.pkl.gz,rb)#从文件中读取数据training_data,validation_data,test_data=cPickle.load(f)f.close()return(training_data,vali

4、dation_data,test_data)defload_data_wrapper():tr_d,va_d,te_d=load_data()#数据转换tr_d是由50000个长度为784的numpy.ndarray组成的tuple#转换后的trainingnputs是由50000个长度为784的numpy.ndarray组成的listtraining_inputs=np.reshape(x,(784,1)forxintr_d0training_results=vectorized_result(y)foryintr_d1训练集training_datazip()返回一个列表的元组,其中每个元

5、组包含从每个参数序列的第个元素。training_data=zip(training_inputs,training_results)validation_inputs=np.reshape(x,(784,1)forxinva_d0验证集validation_datavalidation_data=zip(validation_inputs,va_d1)test_inputs=np.reshape(x,(784,1)forxinte_d0测试集test_datatest_data=zip(test_inputs,te_d1)return(training_data,validation_dat

6、a,test_data)#当预测值与目的值偏差较大时,会导致学习速度降低,故引/CrossEntropyCost=-sum(y*loga+(1-y)log(1-a)/n#交叉熵成本函数classCrossEntropyCost(object):staticmethoddeffn(a,y):#使用0代替数组x中的nan元素,使用有限的数字代替nf元素#sum(-ylog(a)-(1-y)log(1-a)returnnp.sum(np.nan_to_num(-y*np.log(a)-(1-y)*np.log(1-a)#返回从输出层的误差,注意参数Z不使用的方法staticmethoddefdelt

7、a(z,a,y):defdelta(z,a,y):return(a-y)#定义二次和成本函数classQuadraticCost(object):#返回与输出相关联的成本staticmethoddeffn(a,y):return0.5*np.linalg.norm(a-y)*2#返回从输出层的误差staticmethoddefdelta(z,a,y):return(a-y)*sigmoid_prime(z)classNetwork(object):def_init_(self,sizes,cost=CrossEntropyCost):#获取神经网络的层数self.num_layers=len(

8、sizes)sizes即每层神经元的个数self.sizes=sizes#赋随机值(服从高斯分布),对权重和偏向进行初始化bais从第2行开始self.default_weight_initializer()zip从传入的可循环的两组量中取出对应数据组成一个tupleself.cost=cost#计算对应的偏导数x-784维y-10维defbackprop(self,x,y):#返回一个元组(nabla_b,nabla_w)代表成本函数C_x的渐变。nabla_b和nabla_w是numpy数组np.array的逐层列表,类似于self.biases和self.weights.#分别生成与bi

9、asesweights等大小的0矩阵nabla_b=np.zeros(b.shape)forbinself.biasesnabla_w=np.zeros(w.shape)forwinself.weights#激活项直接传入训练实例x的值activation=x#逐层存储所有的激活(不止输入层),作为一个列表activations=x#逐层存储所有中间向量z,作为一个列表zs=forb,winzip(self.biases,self.weights):#计算中间变量Z=W*X+bz=np.dot(w,activation)+b#列表存储所有中间向量zzs.append(z)#激活activati

10、on=sigmoid(W*X+b)activation=sigmoid(z)#列表存储所有的激活activations.append(activation)#反向更新#输出层计算输出层error=Oj(1-Oj)(Tj-Oj);cost_derivative(activations-1,y)即C对a的梯度:(Tj-Oj)即(activations-1-y)sigmoid_prime(zs-1)即:Oj(1-Oj)delta=(self.cost).delta(zs-1,activations-1,y)#更新输出层的nabla_b,nabla_wnabla_b-1=deltanabla_w-1=

11、np.dot(delta,activations-2.transpose()#隐藏层l=1表示神经元的最后一层,l=2是第二层,依此类推反向更新直到初始层forlinxrange(2,self.num_layers):z=zs-lsp=sigmoid_prime(z)#weights-l+1即下一层的权重weights-l+1即下一层的权重delta=np.dot(self.weights-l+1.transpose(),delta)*sp#输出C对w,b的偏导nabla_b-l=deltanabla_w-l=np.dot(delta,activations-l-1.transpose()re

12、turn(nabla_b,nabla_w)epochs训练多少轮,mini_batch_size抽取多少实例,eta学习率defSGD(self,training_data,epochs,mini_batch_size,eta,lmbda-正则化参数lmbda=0.0,evaluation_data=None,monitor_evaluation_cost=False,monitor_evaluation_accuracy=False,monitor_training_cost=False,monitor_training_accuracy=False):#验证集实例数量ifevaluatio

13、n_data:n_data=len(evaluation_data)n=len(training_data)evaluation_cost,evaluation_accuracy=,training_cost,training_accuracy=,#j代表第几轮,共epochs轮forjinxrange(epochs):#将training_data中的数据随机打乱random.shuffle(training_data)mini_batchs每次抽取mini_batch_size大小的数据作为一小块,从0到n每次间隔mini_batch_size张图片mini_batches=trainin

14、g_datak:k+mini_batch_sizeforkinxrange(0,n,mini_batch_size)#对取出来的mini_batchs逐个进行更新formini_batchinmini_batches:#更新weights和biasesself.update_mini_batch(mini_batch,eta,lmbda,len(training_data)printEpoch%strainingcomplete%jifmonitor_training_cost:cost=self.total_cost(training_data,lmbda)training_cost.app

15、end(cost)printCostontrainingdata:.format(cost)ifmonitor_training_accuracy:accuracy=self.accuracy(training_data,convert=True)training_accuracy.append(accuracy)printAccuracyontrainingdata:/.format(accuracy,n)ifmonitor_evaluation_cost:#验证集损失cost=self.total_cost(evaluation_data,lmbda,convert=True)evalua

16、tion_cost.append(cost)printCostonevaluationdata:.format(cost)ifmonitor_evaluation_accuracy:#验证集准确率accuracy=self.accuracy(evaluation_data)evaluation_accuracy.append(accuracy)printAccuracyonevaluationdata:/.format(accuracy,n_data)returnevaluation_cost,evaluation_accuracy,training_cost,training_accurac

17、yeta:学习率n:训练集实例数量#传入单个的mini_batch,根据其x.y值,对整个神经网络的wights和biases进行更新defupdate_mini_batch(self,mini_batch,eta,lmbda,n):#初始化nabla_b=np.zeros(b.shape)forbinself.biasesnabla_w=np.zeros(w.shape)forwinself.weightsforx,yinmini_batch:#计算对应的偏导数delta_nabla_b,delta_nabla_w=self.backprop(x,y)delta_nabla_b,delta_

18、nabla_w=self.backprop(x,y)nabla_b=nb+dnbfornb,dnbinzip(nabla_b,delta_nabla_b)nabla_w=nw+dnwfornw,dnwinzip(nabla_w,delta_nabla_w)权重weights更新Wk=(1-(eta*lmbda/n)W-(eta/n)&C/&Wkself.weights=(1-eta*(lmbda/n)*w-(eta/len(mini_batch)*nwforw,nwinzip(self.weights,nabla_w)偏向biases更新bk=bk-(ets/n)&C/&bkself.bias

19、es=b-(eta/len(mini_batch)*nbforb,nbinzip(self.biases,nabla_b)#赋随机值(服从标准正太分布),对权重和偏向进行初始化defdefault_weight_initializer(self):#第一层为输入层不设置偏差,从第二行开始self.biases=np.random.randn(y,1)foryinself.sizes1:#在同一个神经元的权值的平方根的平方根上用高斯分布平均0和标准偏差1初始化每个权值self.weights=np.random.randn(y,x)/np.sqrt(x)forx,yinzip(self.size

20、s:-1,self.sizes1:)#使用平均0和标准差1的高斯分布初始化权重deflarge_weight_initializer(self):self.biases=np.random.randn(y,1)foryinself.sizes1:self.weights=np.random.randn(y,x)forx,yinzip(self.sizes:-1,self.sizes1:)#准确率defaccuracy(self,data,convert=False)ifconvert:argmax()返回沿轴最大值的索引results=(np.argmax(self.feedforward(x

21、),np.argmax(y)for(x,y)indataelse:results=(np.argmax(self.feedforward(x),y)for(x,y)indatareturnsum(int(x=y)for(x,y)inresults)#如果数据集是训练集(通常情况)设置为false,验证集或测试集,则为truedeftotal_cost(self,data,lmbda,convert=False):cost=0.0forx,yindata:a=self.feedforward(x)ifconvert:y=vectorized_result(y)fn(a,y)=sum(-ylog(

22、a)-(1-y)log(1-a)则cost=fn(a,y)/ncost+=self.cost.fn(a,y)/len(data)#加上正则化项L2-regularization训练集包含实例个数:len(data)正则化项(lmbda/2n)*sum(w*2)cost+=0.5*(lmbda/len(data)*sum(np.linalg.norm(w)*2forwinself.weights)returncost#根据当前输入利用sigmoid函数来计算输出deffeedforward(self,a):forb,winzip(self.biases,self.weights):a=sigmo

23、id(np.dot(w,a)+b)returna#保存神经网络文件filenamedefsave(self,filename):data=sizes:self.sizes,weights:w.tolist()forwinself.weights,biases:b.tolist()forbinself.biases,cost:str(self.cost._name_)f=open(filename,w)json.dump(data,f)f.close()#sigmoid函数defsigmoid(z):return1.0/(1.0+np.exp(-z)#sigmoid函数的导数#sigmoid函数

24、的导数defsigmoid_prime(z):returnsigmoid(z)*(1-sigmoid(z)#向量化defvectorized_result(j):e=np.zeros(10,1)ej=1.0returne#从filename加载神经网络,返回一个神经网络实例defload(filename):f=open(filename,r)data=json.load(f)f.close()cost=getattr(sys.modules_name_,datacost)net=Network(datasizes,cost=cost)net.weights=np.array(w)forwin

25、dataweightsnet.biases=np.array(b)forbindatabiasesreturnnetif_name_=_main_:training_data,valivation_data,test_data=load_data_wrapper()#显示图像ShowImage()static_foonet=Network(784,30,10)#训练集training_data,训练10轮,每次取样10个作为mini_batch,学习率为3net.large_weight_initializer()用cross-entropy来识别MNIST数字times=400evaluation_cost,evaluation_accuracy,training_cost,training_accuracy=net.SG

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论