このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
文字認識
この例では、簡単な文字認識を実行するニューラル ネットワークの学習を行う方法を説明します。
問題の定義
スクリプト 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
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
両方のニューラル ネットワークのテスト
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')
ノイズなしで学習を行ったネットワーク 1 は、ノイズありで学習を行ったネットワーク 2 と比べて、ノイズによるエラーが多く発生しています。