Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

文字認識

この例では、簡単な文字認識を実行するニューラル ネットワークの学習を行う方法を説明します。

問題の定義

スクリプト prprob は、アルファベットの各文字を表す 26 列の行列 X を定義します。各列に、1 か 0 のいずれかの値が 35 個あります。35 個の値からなる各列は、1 つの文字を表す 5 x 7 のビットマップを定義します。

行列 T は 26 行 26 列の単位行列で、26 個の入力ベクトルを 26 個のクラスにマッピングします。

[X,T] = prprob;

ここで、最初の文字である A をビットマップとしてプロットします。

plotchar(X(:,1))

最初のニューラル ネットワークの作成

この問題を解くには、25 個の隠れニューロンでパターン認識を行うよう設定したフィードフォワード ニューラル ネットワークを使用します。

ニューラル ネットワークはランダムな初期重みで初期化されるため、学習後に得られる結果は例を実行するたびに多少異なります。このようなランダム性を回避するには、毎回同じ結果を生成するように乱数シードを設定します。これはユーザー独自のアプリケーションには不要です。

setdemorandstream(pi);

net1 = feedforwardnet(25);
view(net1)

最初のニューラル ネットワークの学習

関数 train によってデータが学習セット、検証セット、およびテスト セットに分割されます。学習セットは、ネットワークの更新に使用されます。検証セットは、学習データに過適合する前にネットワークを停止して、適切な汎化を維持するために使用されます。テスト セットを使用することで、新しい標本に対して期待できるネットワークがどの程度一致しているかを完全に独立して測定できます。

学習セットまたは検証セットでネットワークがこれ以上改善されないと見なされると、学習が停止します。

net1.divideFcn = '';
net1 = train(net1,X,T,nnMATLAB);
 
Computing Resources:
MATLAB on GLNXA64
 

Figure Neural Network Training (27-Jul-2023 15:28:54) contains an object of type uigridlayout.

2 番目のニューラル ネットワークの学習

ネットワークによって、完全な形式の文字だけでなく、ノイズを含む文字も認識されるようにしましょう。そのために、ノイズを含むデータで 2 番目のネットワークの学習を行い、最初のネットワークの場合と汎化の能力を比較してみます。

各文字 Xn についてノイズを含む 30 個のコピーを作成します。値は、min および max によって 0 ~ 1 の範囲に制限されます。対応するターゲット Tn も定義されます。

numNoise = 30;
Xn = min(max(repmat(X,1,numNoise)+randn(35,26*numNoise)*0.2,0),1);
Tn = repmat(T,1,numNoise);

次にノイズを含む文字 A を示します。

figure
plotchar(Xn(:,1))

2 番目のネットワークを作成して、学習を行います。

net2 = feedforwardnet(25);
net2 = train(net2,Xn,Tn,nnMATLAB);
 
Computing Resources:
MATLAB on GLNXA64
 

Figure Neural Network Training (27-Jul-2023 15:29:01) contains an object of type uigridlayout.

両方のニューラル ネットワークのテスト

noiseLevels = 0:.05:1;
numLevels = length(noiseLevels);
percError1 = zeros(1,numLevels);
percError2 = zeros(1,numLevels);
for i = 1:numLevels
  Xtest = min(max(repmat(X,1,numNoise)+randn(35,26*numNoise)*noiseLevels(i),0),1);
  Y1 = net1(Xtest);
  percError1(i) = sum(sum(abs(Tn-compet(Y1))))/(26*numNoise*2);
  Y2 = net2(Xtest);
  percError2(i) = sum(sum(abs(Tn-compet(Y2))))/(26*numNoise*2);
end

figure
plot(noiseLevels,percError1*100,'--',noiseLevels,percError2*100);
title('Percentage of Recognition Errors');
xlabel('Noise Level');
ylabel('Errors');
legend('Network 1','Network 2','Location','NorthWest')

Figure contains an axes object. The axes object with title Percentage of Recognition Errors, xlabel Noise Level, ylabel Errors contains 2 objects of type line. These objects represent Network 1, Network 2.

ノイズなしで学習を行ったネットワーク 1 は、ノイズありで学習を行ったネットワーク 2 と比べて、ノイズによるエラーが多く発生しています。