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

原文地址:https://www.cnblogs.com/tiandsp/p/9042908.html

时间: 2024-11-08 03:30:03

matlab练习程序(神经网络识别mnist手写数据集)的相关文章

用Kersa搭建神经网络【MNIST手写数据集】

MNIST手写数据集的识别算得上是深度学习的"hello world"了,所以想要入门必须得掌握.新手入门可以考虑使用Keras框架达到快速实现的目的. 完整代码如下: # 1. 导入库和模块 from keras.models import Sequential from keras.layers import Conv2D, MaxPool2D from keras.layers import Dense, Flatten from keras.utils import to_ca

MNIST手写数据集在运行中出现问题解决方案

今天在运行手写数据集的过程中,出现一个问题,代码没有问题,但是运行的时候一直报错,错误如下: urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)> 查询网上的各种博客什么的,最后貌似是因为python3的原因出现的,目前采用的解决方案是在代码的顶端

Pytorch入门实战一:LeNet神经网络实现 MNIST手写数字识别

记得第一次接触手写数字识别数据集还在学习TensorFlow,各种sess.run(),头都绕晕了.自从接触pytorch以来,一直想写点什么.曾经在2017年5月,Andrej Karpathy发表的一片Twitter,调侃道:l've been using PyTorch a few months now, l've never felt better, l've more energy.My skin is clearer. My eye sight has improved.确实,使用p

TensorFlow——MNIST手写数据集

MNIST数据集介绍 MNIST数据集中包含了各种各样的手写数字图片,数据集的官网是:http://yann.lecun.com/exdb/mnist/index.html,我们可以从这里下载数据集.使用如下的代码对数据集进行加载: from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 运行上述代码会自动下载数

吴裕雄 python 神经网络——TensorFlow 使用卷积神经网络训练和预测MNIST手写数据集

import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data #设置输入参数 batch_size = 128 test_size = 256 # 初始化权值与定义网络结构,建构一个3个卷积层和3个池化层,一个全连接层和一个输出层的卷积神经网络 # 首先定义初始化权重函数 def init_weights(shape): return tf.Variabl

吴裕雄 python 神经网络——TensorFlow实现回归模型训练预测MNIST手写数据集

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("E:\\MNIST_data\\", one_hot=True) #构建回归模型,输入原始真实值(group truth),采用sotfmax函数拟合,并定义损失函数和优化器 #定义回归模型 x = tf.placeholder(tf.float32,

数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST

目录 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 下载数据集 加载数据集 构建神经网络 反向传播(BP)算法 进行预测 F1验证 总结 参考 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 在本章节中,并不会对神经网络进行介绍,因此如果不了解神经网络的话,强烈推荐先去看<西瓜书>,或者看一下我的上一篇博客:数据挖掘入门系列教程(七点五)之神经网络介绍 本来是打算按照<Python数据挖掘入门与实践>

win10下通过Anaconda安装TensorFlow-GPU1.3版本,并配置pycharm运行Mnist手写识别程序

折腾了一天半终于装好了win10下的TensorFlow-GPU版,在这里做个记录. 准备安装包: visual studio 2015: Anaconda3-4.2.0-Windows-x86_64: pycharm-community: CUDA:cuda_8.0.61_win10:下载时选择 exe(local) CUDA补丁:cuda_8.0.61.2_windows: cuDNN:cudnn-8.0-windows10-x64-v6.0;如果你安装的TensorFlow版本和我一样1.

基于MNIST手写数字数据集的数字识别小程序

30行代码奉上!(MNIST手写数字的识别,识别率大约在91%,简单尝试的一个程序,小玩具而已) 1 import tensorflow.examples.tutorials.mnist.input_data as input_data 2 import tensorflow as tf 3 mnist = input_data.read_data_sets('/temp/', one_hot=True) 4 5 #设置 6 x = tf.placeholder(tf.float32,[None