2層ニューラルネットワーク(Matlab)に基づく手書き数字認識

このプログラムは、2 層のニューラル ネットワークによって実現される手書き数字 0 ~ 9 の認識に基づいています。

1.手書きの数字0~9

トレーニング セットは、ピクセル サイズ 20*20 の 0 ~ 9 の手書き数字 5000 個で、図に示すように、100 個のサンプルが表示されます。

2. ニューラルネットワークの構造

2 層のニューラル ネットワーク構造を次の図に示します。

401 個の入力層ニューロン (1 個のパラノイド ユニットを含む)、26 個の隠れ層ニューロン (1 個のパラノイド ユニットを含む)、10 個の出力層ニューロン

係数行列\シータ_{1}の次数は 25 *401 で、\シータ_{2}の次数は 10 *26 です。

3. 数学的導出

数学的な導出は、記事「単純な 2 層 BP ニューラル ネットワーク - 論理 AND ゲートの実装 (Matlab と Python)」の導出プロセスと似ているため、ここでは繰り返しません。

記事リンク:シンプルな 2 層 BP ニューラル ネットワーク - 論理 AND ゲートの実装 (Matlab および Python) 

4. プログラム(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);

 出力結果:

Training Set Accuracy: 100.000000

 コスト関数のイメージ:

 注: 関連するコンテンツは、Wu Enda の機械学習コースとプログラミング課題を参照して変更されており、侵入された場合は削除される可能性があります。

おすすめ

転載: blog.csdn.net/cxzgood/article/details/120797825