您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 造纸印刷 > ANN-MNIST手写数字识别总结
由于第十四周除了正常上课外,其余时间在整理机器学习的笔记,做中特社会调查报告,然后就是元旦放假,故第十四周没提交周报。本周正常上课,继续完成老师都布置的课业任务,总结通信系统仿真结果,并且完成报告的撰写,分析社会调查结果,做好报告,查阅物理层安全方面的资料,翻译和整理论文。其余时间是开始学习深度学习理论和编程实践,人工神经网络(ANN)和卷积神经网络,了解深度学习几个框架(Caffe、Torch、TensorFlow、MxNet),最主要还是TensorFlow,学习和查找了一下深度学习优化算法,并且利用人工神经网络做手写数字识别。心得体会:第一个感受是时间过得很快,已然是15周了,要加快各方面进程。神经网络从线性分类器开始,线性分类器是产生一个超平面将两类物体分开。一层神经网络叫做感知器,线性映射加激励输出,每个神经元对输入信号利用激励函数选择输出,就像大脑神经元的兴奋或抑制,增加神经元数量、隐层数量,就可以无限逼近位置函数分布的形态,过多会出现过拟合算法。ANN的学习方法是BP后向传播算法,其主要思想是每一层的带来的预测误差是由前一层造成的,通过链式求导法则将误差对每一层的权重和偏置进行求导更新权重和偏置,以达到最优结果。因为ANN每一层神经元是全连接的,对于图像这种数据就需要非常大数量的参数,所以就出现了卷积神经网路CNN,利用一些神经元以各种模版在图像上滑动做卷积形成几张特征图,每个神经元的滑动窗口值不一样代表其关注点不一样,单个神经元对整张图的窗口权重是一样的即权值共享(这就是减少参数和神经元数量的原因),这么做的依据是像素局部关联性。CNN主要有数据数据输入层、卷积计算层、激励层、池化层(下采样层)、全连接层、BatchNormalization层(可能有)CNN学习方法也是BP算法迭代更新权重w和偏置b。CNN优点是共享卷积核,对高维数据处理无压力,无需手动选取特征,训练好权重,即得特征,深层次的网络抽取,信息丰富,表达效果好,缺点是需要调参,需要大样本量,训练最好要GPU,物理含义不明确。主要采用随机失活的方法解决过拟合问题,因为CNN网络学习能力强,如果样本量小,容易让网络将样本的所有细节记忆下来而不是学习到样本的共性规律,所以随机失活神经元让部分神经元工作就可以缓解过拟合问题。个人觉得深度学习理论不是很难,就是对硬件的要求很高,GPU真是其必备工具。深度学习学习最主要的学习框架觉得是TensorFlow,因为Google大力支持,社区很庞大,就是依赖硬件能力强。以下是ANNMNIST手写数字识别程序和结果,数据集是经典的YannLeCun(人工智能界大佬)MNIST数据集,每张照片大小是28*28的灰度图,训练集5000张图片,验证集1000张图片,测试集10000张:构建ANN代码:importrandomimportnumpyasnp#导入numpy计算库classNetwork(object):'''初始化参数'''def__init__(self,sizes):列表“sizes”包含网络各层中的神经元数量。例如,如果列表是[2,3,1],那么它将是三层网络,第一层包含2个神经元,第二层3个神经元和第三层1个神经元。使用均值为0,方差为1的高斯分布随机地初始化网络的偏置和权重。注意,第一层被假定为输入层,并且按照惯例,我们不会为这些神经元设置任何偏置,因为偏置仅用于计算后一层的输出。self.num_layers=len(sizes)self.sizes=sizesself.biases=[np.random.randn(y,1)foryinsizes[1:]]self.weights=[np.random.randn(y,x)forx,yinzip(sizes[:-1],sizes[1:])]'''前向反馈'''deffeedforward(self,a):Returntheoutputofthenetworkif``a``isinput.forb,winzip(self.biases,self.weights):a=sigmoid(np.dot(w,a)+b)returna'''随机梯度下降算法'''defSGD(self,training_data,epochs,mini_batch_size,eta,test_data=None):使用小批量随机梯度下降算法训练神经网络。training_data是表示训练输入和所需输出的元组列表“(x,y)”。epochs表示迭代次数,mini_batch_size表示批量样本尺寸,eta表示学习率。如果提供了`test_data`,那么网络将在每次迭代后利用测试数据对网络进行评估,并打印出部分进度。这对跟踪进度很有帮助,但却大大降低了速度。iftest_data:n_test=len(test_data)n=len(training_data)forjinrange(epochs):random.shuffle(training_data)mini_batches=[training_data[k:k+mini_batch_size]forkinrange(0,n,mini_batch_size)]formini_batchinmini_batches:self.update_mini_batch(mini_batch,eta)iftest_data:print(Epoch{0}:{1}/{2}.format(j,self.evaluate(test_data),n_test))else:print(Epoch{0}complete.format(j))defupdate_mini_batch(self,mini_batch,eta):通过反向传播算法应用梯度下降到一个小批量,更新网络的权重和偏置。“mini_batch”是元组列表“`(x,y)”,“eta”是学习率。nabla_b=[np.zeros(b.shape)forbinself.biases]nabla_w=[np.zeros(w.shape)forwinself.weights]forx,yinmini_batch:delta_nabla_b,delta_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)]self.weights=[w-(eta/len(mini_batch))*nwforw,nwinzip(self.weights,nabla_w)]self.biases=[b-(eta/len(mini_batch))*nbforb,nbinzip(self.biases,nabla_b)]'''反向传播算法'''defbackprop(self,x,y):返回代表代价函数C_x的梯度的元组``(nabla_b,nabla_w)``。``nabla_b``和``nabla_w``是numpy数组的一层一层的列表,类似于`self.biases`和``self.weights``。nabla_b=[np.zeros(b.shape)forbinself.biases]nabla_w=[np.zeros(w.shape)forwinself.weights]#前向反馈activation=xactivations=[x]#一层一层存储所有激励的列表zs=[]#一层一层存储所有z向量的列表rforb,winzip(self.biases,self.weights):z=np.dot(w,activation)+bzs.append(z)activation=sigmoid(z)activations.append(activation)#反向传播delta=self.cost_derivative(activations[-1],y)*\sigmoid_prime(zs[-1])nabla_b[-1]=deltanabla_w[-1]=np.dot(delta,activations[-2].transpose())'''l=1表示最后一层神经元,l=2表示倒数第二层,依此类推。'''forlinrange(2,self.num_layers):z=zs[-l]sp=sigmoid_prime(z)delta=np.dot(self.weights[-l+1].transpose(),delta)*spnabla_b[-l]=deltanabla_w[-l]=np.dot(delta,activations[-l-1].transpose())return(nabla_b,nabla_w)defevaluate(self,test_data):返回神经网络输出正确结果的测试数据的数量。请注意,神经网络的输出被认为是最后一层中具有最高激活的神经元的索引。test_results=[(np.argmax(self.feedforward(x)),y)for(x,y)intest_data]returnsum(int(x==y)for(x,y)intest_results)defcost_derivative(self,output_activations,y):Returnthevectorofpartialderivatives\partialC_x/\partialafortheoutputactivations.return(output_activations-y)###功能函数defsigmoid(z):Thesigmoidfunction.return1.0/(1.0+np.exp(-z))defsigmoid_prime(z):Derivativeofthesigmoidfunction.returnsigmoid(z)*(1-sigmoid(z))读取数据,切分数据代码:importgzipimportnumpyasnpdefload_data():f=gzip.open(mnist.pkl.gz,rb)training_data,validation_data,test_data=cPickle.load(f,encoding='bytes')f.close()return(training_data,validation_data,test_data)defload_data_wrapper():tr_d,va_d,te_d=load_data()training_inputs=[np.reshape(x,(784,1))forxintr_d[0]]training_results=[vectorized_result(y)foryintr_d[1]]training_data=list(zip(training_inputs,training_results))validation_inputs=[np.reshape(x,(784,1))forxinva_d[0]]validation_data=list(zip(validation_inputs,va_d[1]))test_inputs=[np.reshape(x,(784,1))forxinte_d[0]]test_data=list(zip(test_inputs,te_d[1]))return(training_data,validation_data,test_data)defvectorized_result(j):e=np.zeros((10,1))e[j]=1.0returne以下是结果:采用三层网络结构,一个隐层,隐层神经元30个,迭代次数30次,每次批量样本大小是10,学习率(迈的步子大小)是3,最终准确率是95.05%,以前用SVM和随机森林也才90%不到。采用三层网络结构
本文标题:ANN-MNIST手写数字识别总结
链接地址:https://www.777doc.com/doc-7394415 .html