バックプロパゲーションを使用した 2 層ニューラル ネットワークの作成に取り組んでいます。NN は、各行に次の情報を保持する 20001x17 ベクトルからデータを取得することになっています。
-最初の 16 個のセルには、0 から 15 までの範囲の整数が格納されており、変数として機能し、これらの変数を見たときにアルファベットの 26 文字のどれを表現するかを決定するのに役立ちます。たとえば、次のような一連の 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 つのセルを除くすべてにゼロを含む 1x26 ベクトルを出力することになっています。たとえば、出力 [1 0 0 ... 0] は文字 A になり、[0 0 0 ... 1] は文字 Z になります。
コードを提示する前に重要なこと: traingdm 関数を使用する必要があり、隠しレイヤーの番号は (今のところ) 21 に固定されています。
上記の概念を作成しようとして、次の matlab コードを作成しました。
%%%%%%%%
%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%
%%%%%%%%
ここで私の問題:出力を説明どおりにしたい、つまり、たとえば y2 ベクトルの各列は文字の表現にする必要があります。私のコードはそうしません。代わりに、0 と 1 の間、値が 0.1 から 0.9 の間で大きく変化する結果が生成されました。
私の質問は次のとおりです。私がしていない変換を行う必要がありますか? つまり、入力および/または出力データを、NN が正しく学習しているかどうかを実際に確認できる形式に変換する必要がありますか?
任意の入力をいただければ幸いです。