【发布时间】:2017-06-12 06:05:58
【问题描述】:
我正在使用循环神经网络 (RNN) 进行预测,但由于某些奇怪的原因,它总是输出 1。这里我用一个玩具示例对此进行解释:
示例
考虑一个维度为 (360, 5) 的矩阵 M 和一个包含 M 的行和的向量 Y。现在,使用 RNN,我想从 M 预测 Y。使用 rnn R 包,我将模型训练为
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
我在训练时观察到的一件奇怪的事情是 epoch error 总是 4501。理想情况下,epoch error 应该随着 epochs 的增加而减少。
接下来,我创建了一个与上述结构相同的测试数据集:
M2 <- matrix(c(1:15),nrow=3,byrow = TRUE)
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2)))
predictr(model,mt2)
通过预测,我总是得到 1 的输出。 恒定的历元误差和相同的输出可能是什么原因?
更新 #1
@Barker 提供的答案不适用于我的问题。为了使其开放,我在这里通过 Dropbox 链接以traindata、testadata 和我的R 代码共享简约数据。
数据详情:“功率”列是响应变量,它是前几天从第 1 天到第 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。
【问题讨论】:
-
最简单的原因是你的学习率太高,或者模型不适合数据。
-
我发现您的数据有问题。首先数据太小无法调试。给定一个 16 列和 37 行的训练数据集,即使是线性模型也可能会遇到困难,但是神经网络呢?忘掉它。您的数据似乎不按顺序排列,否则每行的滞后将与前几行相同,只是移过一列。 RNN 需要按顺序排列数据。最后,你为什么要使用滞后作为特征呢? RNN 的重点在于“记忆”方面,它可以记住先前的数据。如果您以任何方式提供先验值,那么您的网络就会变得更加复杂。
-
@Barker,我明白你的意思了!但是我仍然面临时间序列数据建模 acc 的问题。对于 RNN 输入,我在 stackoverflow.com/q/42431720/3317829 提出了同样的问题
标签: r neural-network deep-learning lstm recurrent-neural-network