matlab练习程序(神经网络识别mnist手写数据集)
记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对。
这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码。
mnist数据集训练数据一共有28*28*60000个像素,标签有60000个。
测试数据一共有28*28*10000个,标签10000个。
这里神经网络输入层是784个像素,用了100个隐含层,最终10个输出结果。
arc代表的是神经网络结构,可以增加隐含层,不过我试了没太大效果,毕竟梯度消失。
因为是最普通的神经网络,最终识别错误率大概在5%左右。
迭代曲线:

代码如下:
clear all;
close all;
clc; load mnist_uint8; train_x = double(train_x) / 255;
test_x = double(test_x) / 255;
train_y = double(train_y);
test_y = double(test_y); mu=mean(train_x);
sigma=max(std(train_x),eps);
train_x=bsxfun(@minus,train_x,mu); %每个样本分别减去平均值
train_x=bsxfun(@rdivide,train_x,sigma); %分别除以标准差 test_x=bsxfun(@minus,test_x,mu);
test_x=bsxfun(@rdivide,test_x,sigma); arc = [784 100 10]; %输入784,隐含层100,输出10
n=numel(arc); W = cell(1,n-1); %权重矩阵
for i=2:n
W{i-1} = (rand(arc(i),arc(i-1)+1)-0.5) * 8 *sqrt(6 / (arc(i)+arc(i-1)));
end learningRate = 2; %训练速度
numepochs = 5; %训练5遍
batchsize = 100; %一次训练100个数据 m = size(train_x, 1); %数据总量
numbatches = m / batchsize; %一共有numbatches这么多组 %% 训练
L = zeros(numepochs*numbatches,1);
ll=1;
for i = 1 : numepochs
kk = randperm(m);
for l = 1 : numbatches
batch_x = train_x(kk((l - 1) * batchsize + 1 : l * batchsize), :);
batch_y = train_y(kk((l - 1) * batchsize + 1 : l * batchsize), :); %% 正向传播
mm = size(batch_x,1);
x = [ones(mm,1) batch_x];
a{1} = x;
for ii = 2 : n-1
a{ii} = 1.7159*tanh(2/3.*(a{ii - 1} * W{ii - 1}'));
a{ii} = [ones(mm,1) a{ii}];
end a{n} = 1./(1+exp(-(a{n - 1} * W{n - 1}')));
e = batch_y - a{n};
L(ll) = 1/2 * sum(sum(e.^2)) / mm;
ll=ll+1;
%% 反向传播
d{n} = -e.*(a{n}.*(1 - a{n}));
for ii = (n - 1) : -1 : 2
d_act = 1.7159 * 2/3 * (1 - 1/(1.7159)^2 * a{ii}.^2); if ii+1==n
d{ii} = (d{ii + 1} * W{ii}) .* d_act;
else
d{ii} = (d{ii + 1}(:,2:end) * W{ii}).* d_act;
end
end for ii = 1 : n-1
if ii + 1 == n
dW{ii} = (d{ii + 1}' * a{ii}) / size(d{ii + 1}, 1);
else
dW{ii} = (d{ii + 1}(:,2:end)' * a{ii}) / size(d{ii + 1}, 1);
end
end %% 更新参数
for ii = 1 : n - 1
W{ii} = W{ii} - learningRate*dW{ii};
end end
end %% 测试,相当于把正向传播再走一遍
mm = size(test_x,1);
x = [ones(mm,1) test_x];
a{1} = x;
for ii = 2 : n-1
a{ii} = 1.7159 * tanh( 2/3 .* (a{ii - 1} * W{ii - 1}'));
a{ii} = [ones(mm,1) a{ii}];
end
a{n} = 1./(1+exp(-(a{n - 1} * W{n - 1}'))); [~, i] = max(a{end},[],2);
labels = i; %识别后打的标签
[~, expected] = max(test_y,[],2);
bad = find(labels ~= expected); %有哪些识别错了
er = numel(bad) / size(x, 1) %错误率 plot(L);
测试数据可以在这里下载到:https://pan.baidu.com/s/19YPUe9S9xnztg9JGnoXxqw
关注公众号: MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉。
打开微信扫一扫哦!
matlab练习程序(神经网络识别mnist手写数据集)的更多相关文章
- 用Kersa搭建神经网络【MNIST手写数据集】
MNIST手写数据集的识别算得上是深度学习的”hello world“了,所以想要入门必须得掌握.新手入门可以考虑使用Keras框架达到快速实现的目的. 完整代码如下: # 1. 导入库和模块 fro ...
- TensorFlow实战第五课(MNIST手写数据集识别)
Tensorflow实现softmax regression识别手写数字 MNIST手写数字识别可以形象的描述为机器学习领域中的hello world. MNIST是一个非常简单的机器视觉数据集.它由 ...
- 利用sklearn对MNIST手写数据集开始一个简单的二分类判别器项目(在这个过程中学习关于模型性能的评价指标,如accuracy,precision,recall,混淆矩阵)
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 利用卷积神经网络实现MNIST手写数据识别
代码: import torch import torch.nn as nn import torch.utils.data as Data import torchvision # 数据库模块 im ...
- TensorFlow系列专题(六):实战项目Mnist手写数据集识别
欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 目录: 导读 MNIST数据集 数据处理 单层隐藏层神经网络的实现 多层隐藏层神经 ...
- MNIST手写数据集在运行中出现问题解决方案
今天在运行手写数据集的过程中,出现一个问题,代码没有问题,但是运行的时候一直报错,错误如下: urllib.error.URLError: <urlopen error [SSL: CERTIF ...
- Pytorch1.0入门实战一:LeNet神经网络实现 MNIST手写数字识别
记得第一次接触手写数字识别数据集还在学习TensorFlow,各种sess.run(),头都绕晕了.自从接触pytorch以来,一直想写点什么.曾经在2017年5月,Andrej Karpathy发表 ...
- TensorFlow——MNIST手写数据集
MNIST数据集介绍 MNIST数据集中包含了各种各样的手写数字图片,数据集的官网是:http://yann.lecun.com/exdb/mnist/index.html,我们可以从这里下载数据集. ...
- keras—神经网络CNN—MNIST手写数字识别
from keras.datasets import mnist from keras.utils import np_utils from plot_image_1 import plot_imag ...
随机推荐
- 使用MUI的日期控件引起的探索——HTML5 input类型date属性
我写移动端的页面会用到MUI这个框架,个人觉得挺好用的,有很多实用的UI组件.当然坑还是有的,http://dev.dcloud.net.cn/mui/ui/ MUI官网,有兴趣的小伙伴可以看看 虽然 ...
- Vue入门手册整理
目录 第一章.环境搭建 第二章.目录结构 第三章.Vue调试 第四章.定义页面 附录资料 第一章.环境搭建 1.1.准备: npm: 6.9.0 (npm > 3.0) node: v10.15 ...
- maven的安装与配置(本地仓库、阿里云镜像设置)
参考一:https://www.cnblogs.com/sigm/p/6035155.html 参考二:https://blog.csdn.net/AmaniZ/article/details/792 ...
- VMware Workstation下安装Linux
下载VMware Workstation thunder://QUFodHRwczovL2Rvd25sb2FkMy52bXdhcmUuY29tL3NvZnR3YXJlL3drc3QvZmlsZS9WT ...
- BBS论坛(五)
5.1.cms后台修改密码功能完成 (1)新建app/forms.py # app/forms.py from wtforms import Form class BaseForm(Form): de ...
- 【转】ret,retf,iret的区别
ret RET, and its exact synonym RETN, pop IP or EIP from the stack and transfer control to the new ad ...
- 今天俺要说一说装饰着模式(Decorator)
前言:装饰者模式,又叫做装饰器模式.顾名思义,就是给对象包裹一层,包装.让它变成你喜欢的对象.这种模式在我们开发中经常会用到,它是一种处理问题的技巧,即不让程序死板,也可以扩展程序. (一)何时能用到 ...
- 『最短Hamilton路径 状态压缩DP』
状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...
- Android--逐帧动画FrameAnimation
前言 开门见山,本篇博客讲解一下如何在Android平台下播放一个逐帧动画.逐帧动画在Android下可以通过代码和XML文件两种方式定义,本篇博客都将讲到,最后将以一个简单的Demo来演示两种方式定 ...
- 【微信小程序云开发】从陌生到熟悉
前言 微信小程序在9月10号正式上线了云开发的功能,弱化后端和运维概念,以前开发一个小程序需要申请一个小程序,准备一个https的域名,开发需要一个前端一个服务端,有了云开发只有申请一个小程序,一个前 ...