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

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

时间: 2024-10-12 09:55:02

matlab处理手写识别问题的相关文章

【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库

[机器学习算法实现]系列文章将记录个人阅读机器学习论文.书籍过程中所碰到的算法,每篇文章描述一个具体的算法.算法的编程实现.算法的具体应用实例.争取每个算法都用多种语言编程实现.所有代码共享至github:https://github.com/wepe/MachineLearning-Demo     欢迎交流指正! (1)kNN算法_手写识别实例--基于Python和NumPy函数库 1.kNN算法简介 kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算

logistic回归与手写识别例子的实现

本文主要介绍logistic回归相关知识点和一个手写识别的例子实现 一.logistic回归介绍: logistic回归算法很简单,这里简单介绍一下: 1.和线性回归做一个简单的对比 下图就是一个简单的线性回归实例,简单一点就是一个线性方程表示 (就是用来描述自变量和因变量已经偏差的方程) 2.logistic回归 可以看到下图,很难找到一条线性方程能将他们很好的分开.这里也需要用到logistic回归来处理了. logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,

机器学习与数据挖掘-logistic回归及手写识别实例的实现

本文主要介绍logistic回归相关知识点和一个手写识别的例子实现 一.logistic回归介绍: logistic回归算法很简单,这里简单介绍一下: 1.和线性回归做一个简单的对比 下图就是一个简单的线性回归实例,简单一点就是一个线性方程表示 (就是用来描述自变量和因变量已经偏差的方程) 2.logistic回归 可以看到下图,很难找到一条线性方程能将他们很好的分开.这里也需要用到logistic回归来处理了. logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,

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.

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

tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html 前言 这篇博客将利用神经网络去训练MNIST数据集,通过学习到的模型去分类手写数字. 我会将本篇博客的jupyter notebook放在最后,方便你下载在线调试!推荐结合官方的tensorflow教程来看这个notebook! 1. MNIST数据集的导入 这里介绍一下MNIST,MNIST是在

Python 基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 手写数字识别系统的测试代码: from numpy import * import operator from os import listdir #inX    要检测的数据 #dataSet   数据集 #labels    结果集 #k      要对比的长度 def classify0(inX, data

77、tensorflow手写识别基础版本

''' Created on 2017年4月20日 @author: weizhen ''' #手写识别 from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets("/path/to/MNIST_data/",one_hot=True) batch_size=100 xs,ys = mnist.train.next_batch(batch_size) #从trai

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

TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST 卢富毓 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算法 我们知道MNIST的每一张图片都表示一个数字,从0到9.我们希望得到给定图片代表每个数字的概率.比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8的概率是5%(因为8和9都有上半部分的小圆),然后给予它代表其他数字的概率更小的值. 这是一个使用softmax回归(sof

机器学习实战笔记——基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 首先,我们需要将图像格式化处理为一个向量,把一个32X32的二进制图像矩阵通过img2vector()函数转换为1X1024的向量: def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i in range(