matlab 手写识别,matlab处理手写识别问题

初学神经网络算法--梯度下降、反向传播、优化(交叉熵代价函数、L2规范化) 柔性最大值(softmax)还未领会其要义,之后再说

有点懒,暂时不想把算法重新总结,先贴一个之前做过的反向传播的总结ppt

9b46529192211dfd5599f7c60ab67faf.png

afc0cd91ce4c05585bbf1f06f3f3c460.png

def055a99dce55c363b37adca80c972a.png

62212e96e58420018798b9331f1c53d3.png

664f7fc0198d58ade1373b9246147288.png

7fadc9d8a8464a659667821c6910f00d.png

其实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

e21dd0ef3dad8986cbf2284460f7b229.png

04b0b2af436560a9ab5ff149bdd695fa.png

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

20ef1b1e1371245c4d4f68f4d0a89ef8.png

2f67d448e4d4feaf931db7c64619ff55.png

好好学习,天天向上,话说都没有表情用,果然是程序猿的世界,我还是贴个表情吧

eaa0d058e67913115081158906a2c771.gif

【Win 10 应用开发】手写识别

记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...

JS / Egret 单笔手写识别、手势识别

UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...

(手写识别) Zinnia库及其实现方法研究

Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...

android 开源 OCR 项目 及手写识别

http://blog.csdn.net/archfree/article/details/6023676 1)一个为Android平台,将识别由手机的相机拍摄的图像文本应用程序. http://co ...

TensorFlow 入门之手写识别(MNIST) softmax算法

TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST flyu6 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

机器学习实战kNN之手写识别

kNN算法算是机器学习入门级绝佳的素材.书上是这样诠释的:“存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有标签,即我们知道样本集中每一条数据与所属分类的对应关系.输入没有标签的新数据 ...

tensorflow笔记(四)之MNIST手写识别系列一

tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html ...

tensorflow笔记(五)之MNIST手写识别系列二

tensorflow笔记(五)之MNIST手写识别系列二 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7455233.html ...

10分钟搞懂Tensorflow 逻辑回归实现手写识别

1. Tensorflow 逻辑回归实现手写识别 1.1. 逻辑回归原理 1.1.1. 逻辑回归 1.1.2. 损失函数 1.2. 实例:手写识别系统 1.1. 逻辑回归原理 1.1.1. 逻辑回归 ...

随机推荐

NSOperation的start与main,并发与非并发。

http://blog.csdn.net/a2331046/article/details/52294006 在ios4以前,只有非并发的情况下,队列会为operation开启一个线程来执行.如果是并 ...

.net该的帐

1.web api 2.socket通信 3.NUnit单元测试 4.了解自动化测试各种工具

【转载】Android使用Application总结

Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application ...

Win7访问局域网内共享文件夹

\\192.168.1.102\\IP地址

vj1010:高精乘+细心模拟

这题的话思路挺简单的,主要是打一个高精乘,然后考虑一些细节的东西 码得挺少时间的,但是调错调了很久... 讲一下思路吧: 就是读入的时候,先把小数点去掉,mark一下小数点的位置 去掉小数点之后也就进 ...

dedecms在任意页面调用任意栏目文章

dedecms在任意页面调用任意栏目文章,我们用arclist标签即可实现.如果是调用多个栏目文章可以给typeid多个值. 我们以调用ID为1和ID为30的两个栏目下5篇文章为例: {dede:ar ...

C++ bitset 常用函数及运算符

C++ bitset--高端压位卡常题必备STL 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力. bitset存储二进制数位. bitset就像一个bool类型的数组一样,但是有 ...

再测简单的JSP---JSP和Serlet的关系

中第3章 末尾:, 创建一个web动态项目SqlServerTest,创建一个JSP文件index.jsp ,启动服务器 浏览器输入  http://l ...

CS229 6.14 Neurons Networks Restricted Boltzmann Machines

1.RBM简介 受限玻尔兹曼机(Restricted Boltzmann Machines,RBM)最早由hinton提出,是一种无监督学习方法,即对于给定数据,找到最大程度拟合这组数据的参数.RBM ...

C#可扩展数组转变为String[]数组

简单备忘: 由于需要将数据最终以逗号隔开来拼接,因而写了下面的处理方法. public void GetJoinString() { ArrayList arr = new ArrayList(); ...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值