2011-12-19 13 views
2

私はMatlab Neural Networks Toolkitで多層パーセプトロンの実装に問題があります。Matlabニューラルネットワーク - 悪い結果

私はバイナリイメージ(サイズ40x50)として保存された単一文字を認識するニューラルネットワークを実装しようとします。 イメージはバイナリベクトルに変換されます。出力は6ビットでエンコードされます。私は(隠れ層では30のパーセプトロンで)そのように簡単なnewff機能を使用します。

net = newff(P, [30, 6], {'tansig' 'tansig'}, 'traingd', 'learngdm', 'mse');

それから私は、次の列車のパラメータを使用して、3種類のフォントで文字のダースと私のネットワークを訓練:

net.trainParam.epochs=1000000; 
net.trainParam.goal = 0.00001; 
net.traxinParam.lr = 0.01; 

学習後、トレーニングセットのすべての文字が正しく認識されましたが、... 他のフォントの2倍以上の文字は認識できません。

シンプルなネットワークをどうすれば改善できますか?

答えて

1

あなたはトレーニングセットにランダムな弾性ひずみを加えようとすることができます(それを拡張し、より一般化可能にするため)。

あなたはマイクロソフトリサーチから、この素晴らしい記事で詳細を確認することができます(私はあなたの説明を理解していれば、2000) http://research.microsoft.com/pubs/68920/icdar03.pdf

1

あなたが入力変数の非常に多くを持っています。私の最初の提案は、できるだけこの数を減らすことです。いくつかの可能な手法には、入力変数のサブサンプリングや情報量の計算(入力ベクトルを90 = 40 + 50に減らす行と列の合計など)が含まれます。

また、出力は6ビット可能な組み合わせの値は32通りなので、26文字を表すためにこれらを使用していると仮定します。そうであれば、別の出力表現でうまくいくかもしれません。同じように見えない様々な文字が、ビット1上で1の値を共有し、入力から出力へのマッピングを複雑にすると考えてください。クラスごとに1ビットの出力表現は事を単純化するでしょう。

0

newffの代わりにpatternnetを使用すると、パターン認識に適したネットワークが作成されます。ターゲット関数として、右の文字の位置に1を持つ26要素のベクトルを使用します(他の場所では0)。認識の出力は、0と1との間の26の実数値のベクトルであり、認識された文字は最高の値を有する。

トレーニングにはすべてのフォントのデータを使用してください。

trainが自動的に指定された割合に応じて列車の検証・テスト・セットにそれらを分割する、入力すべてのデータセットとして与える:

net.divideParam.trainRatio = .70; 
net.divideParam.valRatio = .15; 
net.divideParam.testRatio = .15; 

(あなたがパーセントを所有して選択します)。

その後

[net, tr] = train(net,inputs,targets); 
tr.testInd 
に、あなたは彼らのインデックスを見つけることができる唯一のテスト・セットを使用してテストします
関連する問題