4

我使用迴歸神經網絡(RNN)進行預測,但是對於一些奇怪的原因,它總是輸出1。這裏我用玩具例如作爲解釋這一點:爲什麼RNN總是輸出1

考慮尺寸爲(360,5)的矩陣M,以及包含的rowum的矢量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 

一個奇怪的事情。

接着,我創建具有相同的結構的測試數據集如上述一個爲:

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

隨着預測,我總是得到輸出爲1。 什麼可以是用於恆定曆元錯誤的原因和相同的輸出?

UPDATE#1

@Barker提供的答案不適用於我的問題。爲了使它開放,在這裏我通過Dropbox鏈接分享極簡主義數據,如traindata,testadata和我的R代碼。

數據詳情:列「功率」是響應變量是溫度,溼度的功能,以及功率消耗的前幾天從DAY1到第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 

我改變參數learning rate, hidden_dim, numepochs,但仍或者導致0.9或1.

+0

最簡單的原因是您的學習率太高,或者模型不符合數據。 –

+0

我發現你的數據有問題。首先,數據太小而無法調試。甚至一個線性模型可能會掙扎給予一個訓練數據集16列和37行,但神經網絡?忘掉它。你的數據似乎並不是爲了其他明智的做法,你的每一行的滯後將與先前的行相同,只是移動到一列。 RNN需要按順序輸入數據。最後,爲什麼你使用滯後作爲功能呢? RNN的全部重點是「記憶」方面,它能夠記住先前的數據。如果你反饋的是先前的價值觀,那麼你的網絡就會變得更加複雜。 – Barker

+0

@巴克,我明白你的意思了!但是我仍然面臨着時間序列數據建模acc的問題。 RNN輸入,我已經問過同樣的問題在http://stackoverflow.com/q/42431720/3317829 –

回答

2

大多數RNN不喜歡沒有恆定均值的數據。處理這個問題的一個策略是區分數據。要看看這是如何工作的,讓我們使用基地R時間系列co2。這是一個時間序列,具有良好的平滑季節性和趨勢,所以我們應該能夠預測它。

co2 time series

對於我們的模型我們的輸入矩陣將成爲「季節性」和co2時間序列的「潮流」,創建使用stl分解。因此,讓我們像以前一樣訓練和測試數據並訓練模型(注意我減少了運行時的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 

埃維,它是所有的人再次,就像在你的榜樣。現在讓我們再試一次,但是這次我們會區分數據。由於我們試圖將我們的預測花費一年半的時間,因此我們將使用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

我還沒有能夠讓他們正常工作,但它似乎需要轉換爲二進制。