Neural Network(神经网络)实例--手写数字识别

来源:互联网 发布:萌妹系衣服淘宝店推荐 编辑:程序博客网 时间:2024/06/10 09:04


本实例整理自斯坦福机器学习课程课后练习ex3

这里写图片描述

本例是对一个手写体的数据集(0-9)进行分类,其最终实现的效果同上一个实例相同。只是两者在实现方式上有所不同。

In the previous part of this exercise, you implemented multi-class logistic regression to recognize handwritten digits. However, logistic regression cannot form more complex hypotheses as it is only a linear classifier. You could add more features (such as polynomial features) to logistic regression, but that can be very expensive to train.

1.Model Representation

本例中的手写体图片采用的是20pixel×20pixel的格式,所有一张图片就有20×20=400个feature,即输入层有400个活化单元(activation unit),加上额外的偏置单元(bias unit)一共就是401个。整个神经网络的模型图如下所示:

这里写图片描述

2.Predict

本例中,第一层与第二层的权重(weights)即参数Θ1(25×401),Θ2(10×26)已经给出,我们只需要根据向前传播(Forward Propagation)的方法进行计算即可。

训练数据X是一个5000×400的矩阵,为了更加容易明白计算过程,我们先取其中的任意一行x(1×400)为例。根据神经网络的数学定义(第三点)知:

Xa1z2a2a2z3a3=[ones(m,1)X];=x;=Θ1a1;=sigmoid(z2);=[1;a2];a2a(0,0)=1,a(1,1)=0=Θ2a2;=sigmoid(z3);

此时相当于一张图片,经过3层的神经网络模型的计算,就可以得出这张图片对应输出层的十个输出的概率了,然后选择概率值最大的输出,我们就可以知道该图片所对应的手写体数字了。

下面是为了更加形象化计算过程:

这里写图片描述

这里写图片描述

这里写图片描述

同之前One-vs-all中一样,g(z3i)代表的是该手写体对应为数字几的概率(其中0映射为10)。

%循环5000次,即可预测出所有图片所对应的手写体for i = 1:m;    a1 = X(i,:)'; % 401 by 1    z2 = Theta1*a1; %  25 by 401  *  401 by 1    a2 = sigmoid(z2);% 25 by 1    a2 = [1;a2]; % column vector , 26 by 1    z3 = Theta2 * a2; % 10 by 26  *  26 by 1    a3 = sigmoid(z3); % 10 by 1    [temp p(i)] = max(a3); end

其中,[temp p(i)] = max(a3),temp 用来保存最大的概率值,p(i)保存为其对应的数字。
a3的可能值为:

a3=[0.21,0.11,0.04,0.51,0.34,0.66,0.71,0.88,0.17,0.32]T temp=0.88,p(i)=8

max的用法戳此处

test =  X(3454,:);[temp pp] = max(predict(Theta1, Theta2, test))y(3454,1) %与已知标记进行对比验证%%以下是输出结果temp =     6pp =     1%说明该图片为数字6的概率接近100%了ans =     6
%这是矢量化的形式,即同时一起计算,不用循环    a1 = X';    z2 = Theta1*a1;    a2 = sigmoid(z2);    a2 = [ones(1,m);a2];    z3 = Theta2 * a2;    a3 = sigmoid(z3);    [temp p] = max(a3);    p = p(:);
阅读全文
0 0
原创粉丝点击