This tutorial covers:
- Generating sample data
- Reshaping input data
- Building the model
- Predicting and plotting a result
We'll start with loading the 'keras' library for R.
library(keras)
Generating sample data
We'll create sample dataset for this tutorial. Here, we'll create 'a' vector with the length of N as a regression data.
N <- 400 set.seed(123) n <- seq(1:N) a <- n/10+4*sin(n/10)+sample(-1:6,N,replace=T)+rnorm(N)
Reshaping input data
Next, we'll create 'x' and 'y' training sequence data. Here, we apply window method with the size of 'step' value. The result (y value) comes after the sequence of window elements (x values), then the window shifts to the next element x and y values are collected and so on.
step <- 4 # step is a window size
To cover all elements in a vector, we'll add a 'step' into the last part of 'a' vector by replicating the last element.
a <- c(a, replicate(step, tail(a, 1)))
Creating x - input, and y - output data.
x <- NULL y <- NULL for(i in 1:N) { s <- i-1+step x <- rbind(x,a[i:s]) y <- rbind(y,a[s+1]) }
Input data should array type, so we'll reshape it.
X <- array(x, dim=c(N, step,1))
Building the model
Next, we'll create Keras sequential model, add layer_simple_rnn layers, and compile it with defined metrics.
model<- keras_model_sequential() %>% layer_simple_rnn(units=128, input_shape=c(step, 1), activation="relu") %>% layer_dense(units = 32) %>% layer_dense(units = 1, activation = "linear") model %>% compile(loss = 'mse', optimizer = 'adam', metrics = list("mean_absolute_error") ) model %>% summary() ____________________________________________________________________________ Layer (type) Output Shape Param # ============================================================================ simple_rnn_71 (SimpleRNN) (None, 128) 16640 ____________________________________________________________________________ dense_155 (Dense) (None, 32) 4128 ____________________________________________________________________________ dense_156 (Dense) (None, 1) 33 ============================================================================ Total params: 20,801 Trainable params: 20,801 Non-trainable params: 0 ____________________________________________________________________________
Predicting and plotting the result
Next, we'll train the model with X and y input data, predict X data, and check the errors.
model %>% fit(X,y, epochs=50, batch_size=32, verbose=0) y_pred <- model %>% predict(X) scores <- model %>% evaluate(X, y, verbose = 0) print(scores) $loss [1] 7.443566 $mean_absolute_error [1] 2.189379
Finally, we'll plot the results.
x_axes <- seq(1:length(y_pred)) plot(x_axes, y, type = "l", col = "red", lwd = 1) lines(x_axes, y_pred, col = "blue", lwd = 2) legend("topleft", legend = c("y-original", "y-predicted"), col = c("red", "blue"), lty = 1, cex = 0.8) | |
library(keras)
N <- 400 set.seed(123) n <- seq(1:N) a <- n/10+4*sin(n/10)+sample(-1:6,N,replace=T)+rnorm(N)
step <- 4 # step is a window size
a <- c(a, replicate(step, tail(a, 1)))
x <- NULL y <- NULL for(i in 1:N) { s <- i-1+step x <- rbind(x,a[i:s]) y <- rbind(y,a[s+1]) }
X <- array(x, dim=c(N, step,1))
model<- keras_model_sequential() %>% layer_simple_rnn(units=128, input_shape=c(step, 1), activation="relu") %>% layer_dense(units = 32) %>% layer_dense(units = 1, activation = "linear") model %>% compile(loss = 'mse', optimizer = 'adam', metrics = list("mean_absolute_error") ) model %>% summary()
model %>% fit(X,y, epochs=50, batch_size=32, verbose=0) y_pred <- model %>% predict(X) scores <- model %>% evaluate(X, y, verbose = 0) print(scores)
x_axes <- seq(1:length(y_pred)) plot(x_axes, y, type = "l", col = "red", lwd = 1) lines(x_axes, y_pred, col = "blue", lwd = 2) legend("topleft", legend = c("y-original", "y-predicted"), col = c("red", "blue"), lty = 1, cex = 0.8)
No comments:
Post a Comment