2009-08-17 3 views
5

私はバックプロパゲーションの2層ニューラルネットワークの作成に取り組んでいます。 NNは、各行の次の情報を保持する20001x17ベクトルからデータを取得することになっています。Matlab - ニューラルネットワークトレーニング

- 最初の16個のセルは、それらの変数を見るときに表現することを意味しています。例えば、以下のような一連の16個の値は、文字Aを表すことを意味する:[2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7]。

- 第17番目のセルには、必要なアルファベットの文字を表す1から26までの数字が入ります。 1はAを表し、2はBなどを表す。

NNの出力レイヤーは26の出力で構成されています。上記のような入力がNNに入力されるたびに、入力値が表す文字に対応する1つのセルを除くすべてのセルに0を含む1x26ベクトルを出力するはずです。例えば、出力[1 0 0 ... 0]は文字Aになりますが、[0 0 0 ... 1]は文字Zになります。

私はコードを提示する前に、私の問題に

%%%%%%%% 
%Start of code% 
%%%%%%%% 

% 
%Initialize the input and target vectors 
% 
p = zeros(16,20001); 
t = zeros(26,20001); 

% 
%Fill the input and training vectors from the dataset provided 
% 
for i=2:20001 
    for k=1:16 
     p(k,i-1) = data(i,k); 
    end 
    t(data(i,17),i-1) = 1; 
end 

net = newff(minmax(p),[21 26],{'logsig' 'logsig'},'traingdm'); 

y1 = sim(net,p); 

net.trainParam.epochs = 200; 
net.trainParam.show = 1; 
net.trainParam.goal = 0.1; 
net.trainParam.lr = 0.8; 
net.trainParam.mc = 0.2; 
net.divideFcn = 'dividerand'; 
net.divideParam.trainRatio = 0.7; 
net.divideParam.testRatio = 0.2; 
net.divideParam.valRatio = 0.1; 

%[pn,ps] = mapminmax(p); 
%[tn,ts] = mapminmax(t); 

net = init(net); 
[net,tr] = train(net,p,t); 

y2 = sim(net,pn); 

%%%%%%%% 
%End of code% 
%%%%%%%% 

:私私は、以下のMATLABコードを書いた上記のコンセプトを作成しようとしてい21

で(今のところ)traingdm機能を使用する必要があり、中間層の数が固定されています。つまり、y2ベクトルの各列は文字の表現でなければなりません。私のコードはそれをしません。代わりに、0と1の間で大きく変化する結果、0.1〜0.9の値が得られました。

私の質問です:私はそうしている必要がある変換がありますか?意味は、自分の入力データや出力データを、自分のNNが正しく学習しているかどうかを確認するためのフォームに変換する必要がありますか?

すべての入力をいただければ幸いです。

答えて

2

これは正常です。あなたの出力層はログシグモイド伝達関数を使用しています。これは常に0と1の間の中間出力を与えます。

あなたが通常行うことは、最も大きな値を持つ出力を探すことです。言葉は、最も可能性の高い文字です。

これは、y2のすべての列について、その行の最大値を含む行のインデックスを探していることを意味します。

[dummy, I]=max(y2); 

I次に、各行の最大値のインデックスを含むベクトルである:次のようにこれを計算することができます。

+0

マーティン、応答に感謝します。 max(y2)を使うと、ネットワークが文字の識別に何回使ったかに関する情報を今すぐに得ることができます。しかし、私がしたデータは、ネットワークに供給する前に、0 <= p(x)<= 1になるようにスケールダウンしました。 pの最小値が0で最大値が15であることを見て、私は新しい入力ベクトルscaledp = p/15を作った。 –

+0

maxをアクティビティ関数として使用しないでください。なぜなら、エラー関数はアクティビティではなくアクティビティ上で定義する必要があり、maxは区別できないため、バックプロパックを使用できないからです。あなたはsoftmaxが必要です、以下の私の答えを見てください。 –

1

Y2の1列が言う場合には、例えば、26アルファベットの文字の1つである、各入力に対する出力確率分布としてY2と考えることができます:その50%の確率その後、

.2 
.5 
.15 
.15 

この文字がBである(4つの可能な出力しかないと仮定した場合)。NNの



== REMARK ==

出力層は 26の出力から成ります。毎回NNは を供給され、それが出力するようになってい 上述のような入力全てにゼロが、入力値を表す ことを意味し、その文字 に対応するもの 細胞を含む1x26ベクトル 。例えば出力[1 0 0 ... 0] [0 0 0 ... 1]は、目標値の使用を避けることが望ましい文字Z.

であろう一方、文字Aであろうネットワークの出力を符号化するために0,1の値をとる。
0と1の目標値を避ける理由は、'logsig'シグモイド伝達関数は有限の重みでこれらの出力値を生成できないためです。正確に0と1の目標値に合わせてネットワークを訓練しようとすると、勾配降下は重みを無制限に増加させます。
したがって、0と1の値の代わりに0.04と0.9の値を使用すると、[0.9,0.04、...、0.04]がAの出力ベクトルになります。


参考:出力層の
トーマス・M.ミッチェル、機械学習、マグロウヒル高等教育、1997、p114-115

+0

私はそれが正しいとは思わない。出力ベクトルの各要素は、0.00と1.00の間で変化する値を持ちますが、任意の列(またはその列の任意の要素)の合計が決して実際にはパーセンテージを表すことはありません。 –

+0

y2正規化= y2 ./ repmat(sum(y2)、26、1) – Amro

+0

また、y2の最高値と2番目の最高値の差を、予測。 – Amro

1
  1. 使用hardlin fcn
    1. trainlmまたはtrainrpをネットワークのトレーニングに使用します。
    2. ネットワークを知るには、forループと出力とターゲットを比較する条件を使用します。それが最善の使用である場合、ブレークループから抜け出すために中断してください。
    3. データ処理の前処理にはmapminmaxの代わりに別の方法を使用してください。
0

私は、これは、実際の答えを構成しているかどうかわからない。しかし、ここでいくつかの発言です。

  • コード体系がわかりません。 「A」はどのようにその数の集合として表されていますか?カテゴリの値をコード化するために任意の数値を使用することのかなり一般的な罠に陥っているようです。たとえば、 'a'が1で、 'b'が2で 'c'が3の場合、 'a'は 'c'よりも 'b'の方が暗いネットワークには順序付けられた特性が重要な実数値入力があります)。これを正しく行うには、各文字を2進数の26個の入力として表現し、そのうちの1個だけが有効で、文字を表します。
  • 出力が正しいです。出力レイヤーでのアクティブ化は、0または1のいずれかの数値ではなく、 になります。あなたは最大で あなたの活動機能を取ることができますが、これは が分化できないので問題であり、バックプロップは使用できません。あなたがすべきことは、 の出力をsoftmax functionに結合して、その合計が になるようにすることです。必要に応じて、入力を与えられた条件付き確率として出力を扱うことができます。ネットワークは 明示的に確率論的ではないが、正しいアクティビティとアクティベーションでは、 関数は構造がlog-linearモデル (潜在変数は隠れ層に対応する)と同じになります。 と人々はこれを常に行います。

David Mackay's textbookを参照してください。確率的な接続を明確にするニューラルネットへの素晴らしい紹介です。正確な表現とアクティベーション/アクティビティ関数の詳細については、コンテキストに応じて次の文字を予測するタスクを説明するthis paper from Geoff Hinton's groupを参照してください(ただし、そのメソッドが自明ではなく、別のトレーニングメソッドを持つ繰り返しネットを使用します)。