最近有一個R PACKAGE - rnn,可以拿來做Recurrent Neural Network (RNN)。雖然現在它只能用CPU,速度很慢,不過他語法簡單,拿來做入門練習是不錯的選擇。
#install.packages('rnn')
rm(list=ls())
require(rnn)
Loading required package: rnn
package 愼㸱愼㸵rnn愼㸱愼㸶 was built under R version 3.3.2
set.seed(10)
f <- 5
w <- 2*pi*f
# Create sequences
t <- seq(0.005,2,by=0.005)
x <- sin(t*w) + rnorm(200, 0, 0.25)
y <- cos(t*w)
# Samples of 20 time series
X <- matrix(x, nrow = 40)
Y <- matrix(y, nrow = 40)
# Plot noisy waves
plot(as.vector(X), col='blue', type='l', ylab = "X,Y",
main = "Noisy waves")
lines(as.vector(Y), col = "red")
legend("topright", c("X", "Y"), col = c("blue","red"),
lty = c(1,1), lwd = c(1,1))

# Standardize in the interval 0 - 1
X <- (X - min(X)) / (max(X) - min(X))
Y <- (Y - min(Y)) / (max(Y) - min(Y))
# Transpose
X <- t(X)
Y <- t(Y)
# Training-testing sets
train <- 1:8
test <- 9:10
# Train model. Keep out the last two sequences.
model <- trainr(Y = Y[train,],
X = X[train,],
learningrate = 0.05,
hidden_dim = 16,
numepochs = 1500)
# Predicted values
Yp <- predictr(model, X)
# Plot predicted vs actual. Training set + testing set
plot(as.vector(t(Y)), col = 'red', type = 'l',
main = "Actual vs predicted", ylab = "Y,Yp")
lines(as.vector(t(Yp)), type = 'l', col = 'blue')
legend("topright", c("Predicted", "Real"),
col = c("blue","red"), lty = c(1,1), lwd = c(1,1))

# Plot predicted vs actual. Testing set only.
plot(as.vector(t(Y[test,])), col = 'red', type='l',
main = "Actual vs predicted: testing set", ylab = "Y,Yp")
lines(as.vector(t(Yp[test,])), type = 'l', col = 'blue')
legend("topright", c("Predicted", "Real"), col = c("blue","red"),
lty = c(1,1), lwd = c(1,1))

LS0tDQp0aXRsZTogIlI6IFJlY3VycmVudCBOZXVyYWwgTmV0d29yayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCuacgOi/keacieS4gOWAi1IgUEFDS0FHRSAtIGBybm5g77yM5Y+v5Lul5ou/5L6G5YGaUmVjdXJyZW50IE5ldXJhbCBOZXR3b3JrIChSTk4p44CC6ZuW54S254++5Zyo5a6D5Y+q6IO955SoQ1BV77yM6YCf5bqm5b6I5oWi77yM5LiN6YGO5LuW6Kqe5rOV57Ch5Zau77yM5ou/5L6G5YGa5YWl6ZaA57e057+S5piv5LiN6Yyv55qE6YG45pOH44CCDQoNCg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygncm5uJykNCnJtKGxpc3Q9bHMoKSkNCnJlcXVpcmUocm5uKQ0Kc2V0LnNlZWQoMTApDQpmIDwtIDUNCncgPC0gMipwaSpmDQpgYGANCg0KYGBge3J9DQojIENyZWF0ZSBzZXF1ZW5jZXMNCnQgPC0gc2VxKDAuMDA1LDIsYnk9MC4wMDUpDQp4IDwtIHNpbih0KncpICsgcm5vcm0oMjAwLCAwLCAwLjI1KQ0KeSA8LSBjb3ModCp3KQ0KDQojIFNhbXBsZXMgb2YgMjAgdGltZSBzZXJpZXMNClggPC0gbWF0cml4KHgsIG5yb3cgPSA0MCkNClkgPC0gbWF0cml4KHksIG5yb3cgPSA0MCkNCg0KDQojIFBsb3Qgbm9pc3kgd2F2ZXMNCnBsb3QoYXMudmVjdG9yKFgpLCBjb2w9J2JsdWUnLCB0eXBlPSdsJywgeWxhYiA9ICJYLFkiLA0KICAgICBtYWluID0gIk5vaXN5IHdhdmVzIikNCmxpbmVzKGFzLnZlY3RvcihZKSwgY29sID0gInJlZCIpDQpsZWdlbmQoInRvcHJpZ2h0IiwgYygiWCIsICJZIiksIGNvbCA9IGMoImJsdWUiLCJyZWQiKSwNCiAgICAgICBsdHkgPSBjKDEsMSksIGx3ZCA9IGMoMSwxKSkNCg0KIyBTdGFuZGFyZGl6ZSBpbiB0aGUgaW50ZXJ2YWwgMCAtIDENClggPC0gKFggLSBtaW4oWCkpIC8gKG1heChYKSAtIG1pbihYKSkNClkgPC0gKFkgLSBtaW4oWSkpIC8gKG1heChZKSAtIG1pbihZKSkNCg0KIyBUcmFuc3Bvc2UNClggPC0gdChYKQ0KWSA8LSB0KFkpDQoNCiMgVHJhaW5pbmctdGVzdGluZyBzZXRzDQp0cmFpbiA8LSAxOjgNCnRlc3QgPC0gOToxMA0KYGBgDQoNCmBgYHtyfQ0KIyBUcmFpbiBtb2RlbC4gS2VlcCBvdXQgdGhlIGxhc3QgdHdvIHNlcXVlbmNlcy4NCm1vZGVsIDwtIHRyYWlucihZID0gWVt0cmFpbixdLA0KICAgICAgICAgICAgICAgIFggPSBYW3RyYWluLF0sDQogICAgICAgICAgICAgICAgbGVhcm5pbmdyYXRlID0gMC4wNSwNCiAgICAgICAgICAgICAgICBoaWRkZW5fZGltID0gMTYsDQogICAgICAgICAgICAgICAgbnVtZXBvY2hzID0gMTUwMCkNCg0KYGBgDQoNCg0KYGBge3J9DQojIFByZWRpY3RlZCB2YWx1ZXMNCllwIDwtIHByZWRpY3RyKG1vZGVsLCBYKQ0KDQojIFBsb3QgcHJlZGljdGVkIHZzIGFjdHVhbC4gVHJhaW5pbmcgc2V0ICsgdGVzdGluZyBzZXQNCnBsb3QoYXMudmVjdG9yKHQoWSkpLCBjb2wgPSAncmVkJywgdHlwZSA9ICdsJywNCiAgICAgbWFpbiA9ICJBY3R1YWwgdnMgcHJlZGljdGVkIiwgeWxhYiA9ICJZLFlwIikNCmxpbmVzKGFzLnZlY3Rvcih0KFlwKSksIHR5cGUgPSAnbCcsIGNvbCA9ICdibHVlJykNCmxlZ2VuZCgidG9wcmlnaHQiLCBjKCJQcmVkaWN0ZWQiLCAiUmVhbCIpLA0KICAgICAgIGNvbCA9IGMoImJsdWUiLCJyZWQiKSwgbHR5ID0gYygxLDEpLCBsd2QgPSBjKDEsMSkpDQoNCiMgUGxvdCBwcmVkaWN0ZWQgdnMgYWN0dWFsLiBUZXN0aW5nIHNldCBvbmx5Lg0KcGxvdChhcy52ZWN0b3IodChZW3Rlc3QsXSkpLCBjb2wgPSAncmVkJywgdHlwZT0nbCcsDQogICAgIG1haW4gPSAiQWN0dWFsIHZzIHByZWRpY3RlZDogdGVzdGluZyBzZXQiLCB5bGFiID0gIlksWXAiKQ0KbGluZXMoYXMudmVjdG9yKHQoWXBbdGVzdCxdKSksIHR5cGUgPSAnbCcsIGNvbCA9ICdibHVlJykNCmxlZ2VuZCgidG9wcmlnaHQiLCBjKCJQcmVkaWN0ZWQiLCAiUmVhbCIpLCBjb2wgPSBjKCJibHVlIiwicmVkIiksDQogICAgICAgbHR5ID0gYygxLDEpLCBsd2QgPSBjKDEsMSkpDQpgYGANCg0K