Я использую периодические нейронные сети (РНН) для прогнозирования, но по какой-то странной причине, он всегда выводит 1. Здесь я объяснить это с игрушкой, например, как:Почему РНН всегда выводится 1
Пример Рассмотрим матрицу M
размеров (360, 5) и вектор Y
, который содержит ряды M
. Теперь, используя RNN, я хочу предсказать Y
от M
. Использование 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
Одна странная вещь, которую я наблюдал во время тренировки в том, что ошибка эпохи всегда 4501. В идеале, ошибка эпоха должна уменьшаться с увеличением эпох.
Далее я создал тестовый набор данных с такой же структурой, как описано выше, один, как:
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 не работает на моей проблеме. Чтобы открыть его, здесь я разделяю минималистические данные с помощью ссылок на ссылки: 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
@ Баркер, я получил вашу мысль! Но я по-прежнему сталкиваюсь с проблемами моделирования временных рядов в соответствии с требованиями. к входу RNN, я задал тот же вопрос по адресу http://stackoverflow.com/q/42431720/3317829 –