4

私は予測のためのリカレントニューラルネットワークに(RNN)を使用していないが、いくつかの奇妙な理由で、それは常に私のようにおもちゃの例でこれを説明ここでは1を出力しますはなぜRNNは常に出力1

次元(360,5)の行列Mと、Mの行数を含むベクトルYを考えてみましょう。今、RNNを使用して、MからYを予測したいと思います。 rnnRパッケージを使用して、私はトレーニングはエポック・エラーは常に4501理想的であるということですが、エポック・エラーがエポックの増加に伴って減少するはずで観察奇妙なことの一つ

library(rnn) 
    M <- matrix(c(1:1800),ncol=5,byrow = TRUE) # Matrix (say features) 
    Y <- apply(M,1,sum) # Output equls to row sum of M 
    mt <- array(c(M),dim=c(NROW(M),1,NCOL(M))) # matrix formatting as [samples, timesteps, features] 
    yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) # formatting 
    model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=1000) # training 

としてモデルを訓練しました。

次に、私はのように1上記と同じ構造のテストデータセットを作成しました:私は常に一定のエポック・エラーの原因になることができますどのような1 として出力を取得し、予測して

M2 <- matrix(c(1:15),nrow=3,byrow = TRUE) 
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2))) 
predictr(model,mt2) 

と同じ出力ですか? @Barkerによって提供さ

UPDATE#1

回答は私の問題では動作しません。それを開くには、ここでは、ドロップボックスリンクを使って最小限のデータをtraindatatestadata、私のRというコードで共有します。

データの詳細:列「パワー」を1日目から、私はパラメータlearning rate, hidden_dim, numepochsを変える14

normalize_data <- function(x){ 
    normalized = (x-min(x))/(max(x)-min(x)) 
    return(normalized) 
} 

#read test and train data 
traindat <- read.csv(file = "train.csv") 
testdat <- read.csv(file = "test.csv") 
# column "power" is response variable and remaining are predictors 
# predictors in traindata 
trainX <- traindat[,1:dim(traindat)[2]-1] 
# response of train data 
trainY <- traindat$power 
# arrange data acc. to RNN as [samples,time steps, features] 
tx <- array(as.matrix(trainX), dim=c(NROW(trainX), 1, NCOL(trainX))) 
tx <- normalize_data(tx) # normalize data in range of [0,1] 
ty <- array(trainY, dim=c(NROW(trainY), 1, NCOL(trainY))) # arrange response acc. to predictors 
# train model 
model <- trainr(X = tx, Y = ty, learningrate = 0.08, hidden_dim = 6, numepochs = 400) 

# predictors in test data 
testX <- testdat[,1:dim(testdat)[2]-1] 
testX <- normalize_data(testX) # normalize data in range of [0,1] 
#testY <- testdat$power 
# arrange data acc. to RNN as [samples,time steps, features] 
tx2 <- array(as.matrix(testX), dim=c(NROW(testX), 1, NCOL(testX))) # predict 
pred <- predictr(model,tx2) 
pred 

日に前の日に消費応答温度、湿度の関数であり、変数、および電源ですが、まだそれを0.9または1のいずれかになります。

+0

最も単純な理由は、学習率が高すぎるか、モデルがデータに適合しないことです。 –

+0

あなたのデータに問題があるとわかりました。まずデータをデバッグするには小さすぎます。線形モデルでさえ、16の列と37の行を持つ訓練データセットが与えられれば苦労するかもしれませんが、ニューラルネットですか?気にしないで。あなたのデータは順番に並んでいないようですが、各行の遅れは前の行と同じになります。 RNNはデータを順番に必要とする。最後に、どうしてラグを機能として使用しているのですか? RNNの全体のポイントは、それが以前のデータを記憶する「記憶」の側面である。とにかく前の値を与えているのであれば、ネットワークは何のためにも複雑になりました。 – Barker

+0

@Barker、私はあなたのポイントを持っています!しかし、私は時系列データモデリングの問題にまだ直面しています。 RNNの入力には、私は同じ質問をhttp://stackoverflow.com/q/42431720/3317829 –

答えて

2

ほとんどのRNNは、一定の平均を持たないデータが好きではありません。これに対処するための1つの戦略は、データを差別化することです。これがどのように機能するかを見るには、R時系列のco2で作業してください。これは、素敵な滑らかな季節性と傾向を持つ時系列ですので、予測できるはずです。

co2 time series

我々のモデルについては、当社の入力行列はstl分解を使用して作成した「季節性」とco2時系列の「トレンド」、になるだろう。ですから、以前と同じように私たちのトレーニングとテストのデータを作ってモデルを訓練させることができます(実行時間についてはnumepochsを減らしました)。私は訓練のために最後の一年半までのすべてのデータを使用して、テストのために最後の一年半を使用します。

#Create the STL decomposition 
sdcomp <- stl(co2, s.window = 7)$time.series[,1:2] 

Y <- window(co2, end = c(1996, 6)) 
M <- window(sdcomp, end = c(1996, 6)) 
#Taken from OP's code 
mt <- array(c(M),dim=c(NROW(M),1,NCOL(M))) 
yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) 
model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=100) 

今、私たちは、テストデータの最後の年に、当社の予測を作成することができます。

M2 <- window(sdcomp, start = c(1996,7)) 
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2))) 
predictr(model,mt2) 

output: 
     [,1] 
[1,] 1 
[2,] 1 
[3,] 1 
[4,] 1 
[5,] 1 
[6,] 1 
[7,] 1 
[8,] 1 
[9,] 1 
[10,] 1 
[11,] 1 
[12,] 1 
[13,] 1 
[14,] 1 
[15,] 1 
[16,] 1 
[17,] 1 
[18,] 1 

エウェ、あなたの例のように、すべてエヴェンです。これをもう一度試してみましょうが、今度はデータを変更します。私たちは1年半の予測を出そうとしているので、18ヵ月前に知っている価値と同じように、差異の遅れとして18を使用します。

dco2 <- diff(co2, 18) 
sdcomp <- stl(dco2, s.window = "periodic")$time.series[,1:2] 
plot(dco2) 

differenced c02 values

グレート、傾向は今では消えている私たちのニューラルネットは、より良いパターンを見つけることができるはずです。新しいデータでもう一度試してみましょう。

Y <- window(dco2, end = c(1996, 6)) 
M <- window(sdcomp, end = c(1996, 6)) 

mt <- array(c(M),dim=c(NROW(M),1,NCOL(M))) 
yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) 
model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=100) 

M2 <- window(sdcomp, start = c(1996,7)) 
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2))) 
(preds <- predictr(model,mt2)) 

output: 
       [,1] 
[1,] 9.999408e-01 
[2,] 9.478496e-01 
[3,] 6.101828e-08 
[4,] 2.615463e-08 
[5,] 3.144719e-08 
[6,] 1.668084e-06 
[7,] 9.972314e-01 
[8,] 9.999901e-01 
[9,] 9.999916e-01 
[10,] 9.999916e-01 
[11,] 9.999916e-01 
[12,] 9.999915e-01 
[13,] 9.999646e-01 
[14,] 1.299846e-02 
[15,] 3.114577e-08 
[16,] 2.432247e-08 
[17,] 2.586075e-08 
[18,] 1.101596e-07 

ここには何かがあります。それはdco2、予想しようとしていたたものに比較してどのように見てみましょう:

Overlay of plots

ない理想的な、しかし、私たちが、それは、データの一般的な「上下」のパターンを見つけることです。今ではあなたの学習率を変えるだけで、ニューラルネットを使って喜びを感じる素敵なハイパーパラメータを使って最適化を始めるだけです。あなたが望むように働いているときは、トレーニングデータの最後の18か月間に最終出力を取り戻すことができます。

+0

でおねがいします。ありがとう、それはこの問題で動作しますが、私の問題では動作しません。あなたが更新された質問を通過し、私が間違っている場所を見つけることができれば本当に感謝します。 –

0

パッケージ(例:?trainrを参照)での例の私のレビューから、トレーニング関数への入力はバイナリでなければなりません。パッケージにはint2binbin2intの機能があります。

正しく動作するようにはできませんでしたが、バイナリへの変換が必要です。

関連する問題