Handschriftliche Ziffernerkennung basierend auf einem zweischichtigen neuronalen Netzwerk (Matlab)

Dieses Programm basiert auf der Erkennung handgeschriebener Ziffern 0-9, die durch ein zweischichtiges neuronales Netzwerk realisiert wird.

1. Handgeschriebene Zahlen 0-9

Der Trainingssatz besteht aus 5000 handgeschriebenen Ziffern 0-9 mit einer Pixelgröße von 20 * 20. Wie in der Abbildung gezeigt, werden 100 Beispiele angezeigt:

2. Struktur des neuronalen Netzwerks

Die zweischichtige neuronale Netzwerkstruktur ist in der folgenden Abbildung dargestellt:

401 Neuronen der Eingabeschicht (einschließlich 1 paranoide Einheit), 26 Neuronen der versteckten Schicht (einschließlich paranoider Einheit), 10 Neuronen der Ausgabeschicht

\Theta_{1}Die Ordnung der Koeffizientenmatrix ist 25 *401 \Theta_{2}und die Ordnung ist 10 *26 .

3. Mathematische Ableitung

Die mathematische Ableitung ähnelt dem Ableitungsprozess im Artikel „Simple Two-Layer BP Neural Network – Implementing Logical AND Gate (Matlab and Python)“, daher werde ich sie hier nicht wiederholen.

Artikel-Link: Einfaches zweischichtiges BP-Neuronales Netzwerk – Implementierung logischer UND-Gatter (Matlab und Python) 

4. Programm (Matlab)

clear all;clc

%数据初始化
num_labels = 10;          
% Load Training Data                          
load('data.mat');
m = size(X, 1);

% Randomly select 100 data points to display
sel = randperm(size(X, 1));
sel = sel(1:100);
figure
displayData(X(sel, :));

%Loading Parameters
load('weights.mat');

alpha = 3;                 %learning_rate
number_iters = 5000;       %number_of_training_iterations

%迭代
for i=1:number_iters
    
  %Forward Propagation
    a1 = [ones(m, 1) X];   %5000x401
    z2 = a1 * Theta1';     %5000x25   Theta1 25*401
    a2 = sigmoid(z2);      %5000x25
    a2 = [ones(m, 1) a2];  %5000x26
    z3 = a2 * Theta2';     %5000x10   Theta2 10*26
    a3 = sigmoid(z3);      %5000x10
    h = a3;                %5000x10

    u = eye(num_labels);
    y1 = u(y,:);
   
  %Back Propagation
   delta3 = a3 - y1;                        % 5000 * 10
   delta2 = delta3 * Theta2;               % 5000 * 26
   delta2 = delta2(:,2:end);               % 5000 * 25
   delta2 = delta2 .* sigmoidGradient(z2); % 5000 * 25

   Delta1 = zeros(size(Theta1));           % 25 * 401
   Delta2 = zeros(size(Theta2));           % 10 * 26
   Delta1 = Delta1 + delta2' * a1;         % 25 * 401 5000×25' * 5000x401
   Delta2 = Delta2 + delta3' * a2;         % 10 * 26  5000×10' * 5000x26
   Theta2_grad = 1/m * Delta2;
   Theta1_grad = 1/m * Delta1;
   
   Theta1 = Theta1 - alpha * Theta1_grad;
   Theta2 = Theta2 - alpha * Theta2_grad;
   
   J(i) = 1/m*(sum(sum(-y1 .* log(h) - (1 - y1) .* log(1 - h))));
end

%绘制代价函数曲线
figure
plot(J);
xlabel('number of iterations')
ylabel('Costfunction in the output layer');

%预测
pred = predict(Theta1, Theta2, X);
fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);

 Ausgabeergebnis:

Training Set Accuracy: 100.000000

 Kostenfunktionsbild:

 Hinweis: Der relevante Inhalt wird durch Bezugnahme auf den Kurs und die Programmieraufgaben von Wu Enda für maschinelles Lernen geändert und kann bei Eingriffen gelöscht werden.

Supongo que te gusta

Origin blog.csdn.net/cxzgood/article/details/120797825
Recomendado
Clasificación