2009-10-14 16 views
18

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

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

sine()の出力が-1と1の間に0と1の間だけを出力するsigmoid伝達関数(私のアプリケーションでは要件です)を使用しているため、問題があると感じました。これを修正しようとすると、出力を2倍して1を引いてみましたが、これで問題は解決されませんでした。私はこの仕事をするためにどこかの種類の変換を行わなければならないと思っています。

アイデア?

+0

NNベースの近似の研究実装を見ることに興味があるなら、私の[近似計算の調査票](https://www.academia.edu/20201007/A_Survey_Of_Techniques_for_Approximate_Computing)を参照してください。 – user984260

答えて

16

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

Rを使った簡単な例です:

あなたがネットワークを訓練するとき、あなたは、範囲[0,1]にターゲット(sin関数)を正規化する必要があります
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") 

neural net prediction

+0

リニア出力ユニットでは、出力ユニットのf(net)= netを計算することを意味しますか?私はこれを試して、同じ問題を抱えているからです。 – MahlerFive

+0

まさに線形関数f(x)= a * x – rcs

+0

細部の詳細ですが、あなたのr-project.orgハイパーリンクは「www。」を付けずには機能しません。 –

11

シグモイド伝達関数を維持することができます。

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 
    ... 

注我々はトレーニングする前に、ターゲットをマッピングされていることこと。ネットワークをトレーニングしてシミュレートすると、ネットの出力をマップすることができます。 6用の低側の間違いではあるが、

%% 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()'}) 

network output

0

ネットワークが動作してはならない理由はない:以下


説明するためのMATLABコードです正弦波を近似する。私は少なくとも10人、さらには20人もいます。

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

0

バニラ勾配降下を使用する場合は同じ動作になります。別のトレーニングアルゴリズムを試してみてください。

Javaアプレットに関する限り、私は何か面白かったことがありました。「双極性シグモイド」を使用すると収束し、いくつかの非ランダムウェイトから始めます(二次関数を使用した以前のトレーニングの結果関数)。