在‘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就可以得到相应的预测输出,判断属于哪一类。
神经网络对于复杂的分类具有很大的优越性,但是怎么确定神经网络的参数是个复杂的问题,一般通过神经网络的“反向传播确定训练的参数”。