22

自分で作成したニューラル ネットワークを使用して、sine() 関数を近似しようとしています。単純な OCR 問題でニューラル ネットワークをテストしましたが、うまくいきましたが、それを適用して sine() を近似するのに問題があります。私の問題は、トレーニング中にエラーが正確に 50% に収束することです。したがって、完全にランダムであると推測しています。

入力 (0 から PI) に 1 つの入力ニューロンを使用し、結果に 1 つの出力ニューロンを使用しています。私はニューロンの数を変えることができる単一の隠れ層を持っていますが、現在は約6〜10を試しています.

問題は、sine() の出力が -1 と 1 の間であるのに対し、0 と 1 の間のみを出力するシグモイド伝達関数 (私のアプリケーションの要件) を使用しているためだと感じています。この出力に 2 を掛けてから 1 を引いてみましたが、問題は解決しませんでした。これを機能させるには、どこかで何らかの変換を行う必要があると考えています。

何か案は?

4

4 に答える 4

16

リニア出力ユニットを使用してください。

Rを使用した簡単な例を次に示します。

set.seed(1405)
x <- sort(10*runif(50))
y <- sin(x) + 0.2*rnorm(x)

library(nnet)
nn <- nnet(x, y, size=6, maxit=40, linout=TRUE)
plot(x, y)
plot(sin, 0, 10, add=TRUE)
x1 <- seq(0, 10, by=0.1)
lines(x1, predict(nn, data.frame(x=x1)), col="green")

ニューラルネット予測

于 2009-10-14T09:23:45.503 に答える
12

ネットワークをトレーニングするときは、ターゲット (sin 関数) を範囲 [0,1] に正規化する必要があります。そうすれば、シグモイド伝達関数を維持できます。

sin(x) in [-1,1]  =>  0.5*(sin(x)+1) in [0,1]

Train data:
    input    target    target_normalized
    ------------------------------------
    0         0          0.5
    pi/4      0.70711    0.85355
    pi/2      1           1
    ...

トレーニングのにターゲットをマッピングしたことに注意してください。ネットワークをトレーニングしてシミュレートしたら、ネットの出力を元に戻すことができます。


以下は、説明するための MATLAB コードです。

%% input and target
input = linspace(0,4*pi,200);
target = sin(input) + 0.2*randn(size(input));

% mapping
[targetMinMax,mapping] = mapminmax(target,0,1);

%% create network (one hidden layer with 6 nodes)
net = newfit(input, targetMinMax, [6], {'tansig' 'tansig'});
net.trainParam.epochs = 50;
view(net)

%% training
net = init(net);                            % init
[net,tr] = train(net, input, targetMinMax); % train
output = sim(net, input);                   % predict

%% view prediction
plot(input, mapminmax('reverse', output, mapping), 'r', 'linewidth',2), hold on
plot(input, target, 'o')
plot(input, sin(input), 'g')
hold off
legend({'predicted' 'target' 'sin()'})

通信網 出力

于 2009-10-15T22:41:10.840 に答える
0

バニラ最急降下法を使用しても同じ動作が得られます。別のトレーニングアルゴリズムを使用してみてください。

Javaアプレットに関する限り、興味深いことに気づきました。「双極シグモイド」を使用し、ランダムでない重み(2次関数を使用した以前のトレーニングの結果など)から始めると収束します。

于 2012-06-22T05:30:57.733 に答える
0

ネットワークが機能しない理由はありませんが、6は正弦波を近似するためのローサイドです。私は少なくとも10、多分20を試してみます。

それがうまくいかない場合は、システムについてさらに詳しく説明する必要があると思います。つまり、学習アルゴリズム(バックプロパゲーション?)、学習率などです。

于 2009-10-21T09:30:47.053 に答える