matlab处理手写识别问题
初学神经网络算法--梯度下降、反向传播、优化(交叉熵代价函数、L2规范化) 柔性最大值(softmax)还未领会其要义,之后再说
有点懒,暂时不想把算法重新总结,先贴一个之前做过的反向传播的总结ppt
其实python更好实现些,不过我想好好学matlab,就用matlab写了
然后是算法源码,第一个啰嗦些,不过可以帮助理解算法
function bpback1(ny,eta,mini_size,epoch) %ny:隐藏层为1层,神经元数目为ny;eta:学习速率;mini_size:最小采样;eopch:迭代次数 %该函数为梯度下降+反向传播 %images [numimages,images]=bpimages('train-images.idx3-ubyte'); [n_test,test_data_x]=bpimages('t10k-images.idx3-ubyte'); %labels [numlabels,labels]=bplabels('train-labels.idx1-ubyte'); [n_test,test_data_y]=bplabels('t10k-labels.idx1-ubyte'); %init w/b %rand('state',sum(100*clock)); %ny=30;eta=0.01;mini_size=10; w1=randn(ny,784); b1=randn(ny,1); w2=randn(10,ny); b2=randn(10,1); for epo=1:epoch for nums=1:numimages/mini_size for num=(nums-1)*mini_size+1:nums*mini_size x=images(:,num); y=labels(:,num); net2=w1*x; %input of net2 for i=1:ny hidden(i)=1/(1+exp(-net2(i)-b1(i)));%output of net2 end net3=w2*hidden'; %input of net3 for i=1:10 o(i)=1/(1+exp(-net3(i)-b2(i)));%output of net3 end %back for i=1:10 delta3(i)=(y(i)-o(i))*o(i)*(1-o(i));%delta of net3 end for i=1:ny delta2(i)=delta3*w2(:,i)*hidden(i)*(1-hidden(i));%delta of net2 end %updata w/b for i=1:10 for j=1:ny w2(i,j)=w2(i,j)+eta*delta3(i)*hidden(j)/mini_size; end end for i=1:ny for j=1:784 w1(i,j)=w1(i,j)+eta*delta2(i)*x(j)/mini_size; end end for i=1:10 b2(i)=b2(i)+eta*delta3(i); end for i=1:ny b1(i)=b1(i)+eta*delta2(i); end end end %calculate sum of error %accuracy sum0=0; for i=1:1000 x0=test_data_x(:,i); y0=test_data_y(:,i); a1=[]; a2=[]; s1=w1*x0; for j=1:ny a1(j)=1/(1+exp(-s1(j)-b1(j))); end s2=w2*a1'; for j=1:10 a2(j)=1/(1+exp(-s2(j)-b2(j))); end a2=a2'; [m1,n1]=max(a2); [m2,n2]=max(y0); if n1==n2 sum0=sum0+1; end %e=o'-y; %sigma(num)=e'*e; sigma(i)=sumsqr(a2-y0); %代价为误差平方和 end sigmas(epo)=sum(sigma)/(2*1000); fprintf('epoch %d:%d/%d\n',epo,sum0,1000); end plot(sigmas); xlabel('epoch'); ylabel('cost on the training_data'); end
function bpback2(ny,eta,mini_size,epoch,numda) %ny:隐藏层为1层,神经元数目为ny;eta:学习速率;mini_size:最小采样;eopch:迭代次数 %bpback的优化,包括L2规范化、交叉熵代价函数的引入---结果证明该优化非常赞! %images [numimages,images]=bpimages('train-images.idx3-ubyte'); [n_test,test_data_x]=bpimages('t10k-images.idx3-ubyte'); %labels [numlabels,labels]=bplabels('train-labels.idx1-ubyte'); [n_test,test_data_y]=bplabels('t10k-labels.idx1-ubyte'); %init w/b %ny=30;eta=0.05;mini_size=10;epoch=10;numda=0.1; rand('state',sum(100*clock)); w1=randn(ny,784)/sqrt(784); b1=randn(ny,1); w2=randn(10,ny)/sqrt(ny); b2=randn(10,1); for epo=1:epoch for nums=1:numimages/mini_size for num=(nums-1)*mini_size+1:nums*mini_size x=images(:,num); y=labels(:,num); net2=w1*x; %input of net2 hidden=1./(1+exp(-net2-b1));%output of net2 net3=w2*hidden; %input of net3 o=1./(1+exp(-net3-b2));%output of net3 %back delta3=(y-o);%delta of net3 由于交叉熵代价函数的引入,偏导被消去 delta2=w2'*delta3.*(hidden.*(1-hidden));%delta of net2 %updata w/b w2=w2*(1-eta*numda/numimages)+eta*delta3*hidden'/mini_size; %L2规范化 w1=w1*(1-eta*numda/numimages)+eta*delta2*x'/mini_size; b2=b2+eta*delta3/mini_size; b1=b1+eta*delta2/mini_size; end end %calculate sum of error %accuracy sum0=0; for i=1:1000 x0=test_data_x(:,i); y0=test_data_y(:,i); a1=[]; a2=[]; a1=1./(1+exp(-w1*x0-b1)); a2=1./(1+exp(-w2*a1-b2)); [m1,n1]=max(a2); [m2,n2]=max(y0); if n1==n2 sum0=sum0+1; end %e=o'-y; %sigma(num)=e'*e; sigma(i)=m2*log(m1)+(1-m2)*log(1-m1); %计算代价cost end sigmas(epo)=-sum(sigma)/1000; %cost求和 fprintf('epoch %d:%d/%d\n',epo,sum0,1000); end plot(sigmas); xlabel('epoch'); ylabel('cost on the training_data'); end
好好学习,天天向上,话说都没有表情用,果然是程序猿的世界,我还是贴个表情吧
matlab处理手写识别问题的更多相关文章
- 基于MATLAB的手写公式识别(9)
基于MATLAB的手写公式识别(9) 1.2图像的二值化 close all; clear all; Img=imread('drink.jpg'); %灰度化 Img_Gray=rgb2gray(I ...
- 基于MATLAB的手写公式识别(6)
基于MATLAB的手写公式识别 2021-03-29 10:24:51 走通了程序,可以识别"心脑血管这几个字",还有很多不懂的地方. 2021-03-29 12:20:01 tw ...
- 基于MATLAB的手写公式识别(5)
基于MATLAB的手写公式识别 总结一下昨天一天的工作成果: 获得了大致的识别过程. 一个图像从生肉到可以被处理需要经过预处理(灰质化.增加对比度.中值过滤.膨胀或腐蚀.闭环运算). 掌握了相关函数的 ...
- 基于MATLAB的手写公式识别(3)
基于MATLAB的手写公式识别 图像的膨胀化,获取边缘(思考是否需要做这种处理,初始参考样本相对简单) %膨胀 imdilate(dilate=膨胀/扩大) clc clear A1=imread(' ...
- 基于MATLAB的手写公式识别(2)
基于MATLAB的手写公式识别 图像的预处理(除去噪声.得到后续定位分割所需的信息.) 预处理其本质就是去除不需要的噪声信息,得到后续定位分割所需要的图像信息.图像信息在采集的过程中由于天气环境的影响 ...
- 基于MATLAB的手写公式识别(1)
基于MATLAB的手写公式识别 reason:课程要求以及对MATLAB强大生命力的探索欲望: plan date:2021/3/28-2021/4/12 plan: 进行材料搜集和思路整理: 在已知 ...
- 【Win 10 应用开发】手写识别
记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...
- JS / Egret 单笔手写识别、手势识别
UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...
- (手写识别) Zinnia库及其实现方法研究
Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...
随机推荐
- 比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle
比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在Kafka的监控系统中有很多优秀的开源监控系统.比如Kaf ...
- Hbase balancer RSgroup shell 脚本
#!/bin/bashTMP_FILE=tmp_groupsGROUPS_FILE=groups.txtecho "list_groups" | hbase shell > ...
- idea打开项目没有文件目录
如题,利用idea打开一个项目,然而并没有src等主要文件目录. 方法:使用ctrl+shift+alt+s打开目录结构,选择module,再选择import module,注意选择SDK,即JDK.
- 自学python 3.
1.name = "aleX leNb" 1.a = name.strip() print(a) 2.a = name.lstrip('al') print(a) 3.a = na ...
- 细说shiro之一:shiro简介
官网:https://shiro.apache.org/ 一. Shiro是什么Shiro是一个Java平台的开源权限框架,用于认证和访问授权.具体来说,满足对如下元素的支持: 用户,角色,权限(仅仅 ...
- C JAVA你可能不知道的那些编程细节
关于printf的格式化字符 %* *与其它占位符结合使用, *将首先被一个 int 变量值代替后再被格式化. 如 printf("%.*s.", 2, "Hello&q ...
- js 操作对象 记录
js 对象记录一下: let obj_1 = { name : 'james', age : '22', sex: '1' } for ( i in obj_1 ) { console.log(i) ...
- 22.doublewrite/ChangeBuffer/AHI/FNP
一. Double Write1 Double Write介绍 • Double Write的目的是为了保证数据写入的可靠性, 避免partial write 的情况 ◦ partial write( ...
- 20155324王鸣宇安装虚拟机+初次学习Linux的感想20155324
安装Linux系统 这是最后一次预备作业,但不是最后一次作业.当然要认真对待,在这个除旧迎新的日子里.认真的花了一个下午的时间专研学习了如何安装Linux系统.通过学习了基于VirtualBox虚拟机 ...
- 《Python数据可视化编程实战》
第一章:准备工作环境 WinPython-32bit-3.5.2.2Qt5.exe 1.1 设置matplotlib参数 配置模板以方便各项目共享 D:\Bin\WinPython-32bit-3.5 ...