神经网络识别手写数字(注意与逻辑回归多分类对比)-------编程详解

在‘https://blog.csdn.net/weixin_44102752/article/details/102904349’,实现了逻辑回归多分类来识别手写数字,然而逻辑回归仅仅是线性分类器,无法形成更复杂的假设,我们运用神经网络的“前向传播”算法对相同的数据集进行识别,进行比较。
神经网络结构介绍参见:https://blog.csdn.net/weixin_44102752/article/details/102669886
我们的神经网络如下图所示。它有3层-一个输入层,一个隐藏层和一个输出层。回想一下,我们的输入是数字图像的像素值。由于图像的大小是20 x 20,这给了我们400个输入层单元(不包括额外的偏置单元,使用的时候记得+1)。与之前一样,训练数据将被加载到变量X和y中。
在这里插入图片描述
对神经网络参数进行定义:

input_layer_size  = 400;  % 20x20 Input Images of Digits
hidden_layer_size = 25;   % 25 hidden units
num_labels = 10;          % 10 labels, from 1 to 10   
                          % (note that we have mapped "0" to label 10)

存储在ex3weights中,有Theta1和Theta2中,参数的大小是为第二层有25个单元的神经网络和10个输出单元(对应于10个数字类)确定的。(参数的计算是根据神经网络的反向传播算法算出来的,见另一篇“网址 ”)
加载神经网络的参数:

load('ex3weights.mat');

运用前向传播进行预测:

function p = predict(Theta1, Theta2, X)
%PREDICT Predict the label of an input given a trained neural network
%   p = PREDICT(Theta1, Theta2, X) outputs the predicted label of X given the
%   trained weights of a neural network (Theta1, Theta2)

m = size(X, 1);
num_labels = size(Theta2, 1);

% You need to return the following variables correctly 
p = zeros(size(X, 1), 1);

%%第二层:
X=[ones(m,1) X];    %为X增加一列1
secondlay=sigmoid(X*Theta1');  %第二层神经网络的输出
%%输出层:
secondlay=[ones(m,1) secondlay];   %为第二层的参数增加一列偏置单元1
outputlay=sigmoid(secondlay*Theta2');
[maxnum,p]=max(outputlay,[],2);
end

注意:
1.进行前向传播时,要对每一层的“输入”层增加一列偏置单元
2.矩阵乘法要注意相乘的矩阵的行列数。

进行预测:

pred = predict(Theta1, Theta2, X);

fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);  %得出预测准确率

对几个例子进行预测

rp = randperm(m);

for i = 1:m
    % Display 
    fprintf('\nDisplaying Example Image\n');
    displayData(X(rp(i), :));

    pred = predict(Theta1, Theta2, X(rp(i),:));
    fprintf('\nNeural Network Prediction: %d (digit %d)\n', pred, mod(pred, 10));
    
    % Pause with quit option
    s = input('Paused - press enter to continue, q to exit:','s');
    if s == 'q'
      break
    end
end

结果应该如下:
在这里插入图片描述
神经网络模型应用于分类问题,要注意根据分类的类别来确定最后的输出层数目,若对于简单的二分类问题,与逻辑回归和线性回归一样,只有一个输出单元,y=0或1。若对于多分类问题来说,则输出层就不止一个,输出的就是一个向量,属于哪个类哪个位置就为1.
以下面一个多分类问题为例子:
在这里插入图片描述
该网络具有4个输出单元,相当于是个四分类问题,所以最后预测的结果y有以下几种可能;
在这里插入图片描述
不同的向量y对应属于不同的类别。然后根据向量y就可以得到相应的预测输出,判断属于哪一类。
神经网络对于复杂的分类具有很大的优越性,但是怎么确定神经网络的参数是个复杂的问题,一般通过神经网络的“反向传播确定训练的参数”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值