Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

For anyone interested, a new version (v.0.1.4) of nnlib2Rcpp is available on GitHub. It can be installed the usual way for packages on GitHub:

library(devtools)
install_github("VNNikolaidis/nnlib2Rcpp")

nnlib2Rcpp is an R package containing a number of Neural Network (NN) implementations. The NNs are implemented in C++ (using nnlib2 C++ class library) and are interfaced with R via Rcpp package (which is required). The package currently includes versions of Back-Propagation, Autoencoder, Learning Vector Quantization (unsupervised and supervised) and simple Matrix-Associative-Memory neural networks. Functions and modules for directly using these models from R are provided.

Furthermore, a new “NN” module (NN-class) has been added to version 0.1.4, that allows the creation of custom NNs using predefined components, and manipulation of the network and its components from R. It also provides a fixed procedure for defining new NN component types (layers, nodes, sets of connections etc) which can then be used in the module (some familiarity with C++ is required).

The  “NN” (aka NN-class)   provides methods for handling the NN, such as: add_layer, add_connection_set, create_connections_in_sets, connect_layers_at, fully_connect_layers_at, add_single_connection, input_at, encode_at, encode_all, recall_at, recall_all, get_output_from, get_input_at, get_weights_at, print, outline.

A (rather useless and silly) example of using the “NN” module follows:
# (1.A) create new 'NN' object:
n <- new("NN")

# 1. add a layer of 4 generic nodes:
n$add_layer("generic",4) # 2. add (empty) set for connections that pass data unmodified: n$add_connection_set("pass-through")
# 3. add another layer of 2 generic nodes:
n$add_layer("generic",2) # 4. add (empty) set for connections that pass data * weight: n$add_connection_set("wpass-through")
# 5. add a layer of 1 generic node:
n$add_layer("generic",1) # Create actual connections in sets,w/random initial weights in [0,1]: n$create_connections_in_sets(0,1)
# Optionally, show an outline of the topology:
n$outline() # (1.C) use the network. # input some data, and run create output for it: n$input_at(1,c(10,20,30,40))
n$recall_all(TRUE) # the final output: n$get_output_from(5)

# (1.D) optionally, examine the network:
# the input at first layer at position 1:
n$get_input_at(1) # Data is passed unmodified through connections at position 2, # and (by default) summed together at each node of layer at 3. # Final output from layer in position 3: n$get_output_from(3)
# Data is then passed multiplied by the random weights through
# connections at position 4. The weights of these connections:
n$get_weights_at(4) # Data is finally summed together at the node of layer at position 5, # producing the final output, which (again) is: n$get_output_from(5)

The next example, creates a simple MAM using the “NN” (NN-class) module:
# (2.A) Create the NN and its components:

m <- new( "NN" )
m$add_layer( "generic" , 4 ) m$add_layer( "generic" , 3 )
m$fully_connect_layers_at(1, 2, "MAM", 0, 0) # (2.B) Use it to store iris species: iris_data <- as.matrix( scale( iris[1:4] ) ) iris_species <- as.integer( iris$Species )
for(r in 1:nrow( iris_data ) )
{
x <- iris_data[r,]
z <- rep( -1, 3 )
z [ iris_species[r] ] <- 1
m$input_at( 1, x ) m$input_at( 3, z )
m$encode_all( TRUE ) } # (2.C) Attempt to recall iris species: recalled_ids <- NULL; for(r in 1:nrow(iris_data)) { x <- iris_data[r,] m$input_at( 1, x )
m$recall_all( TRUE ) z <- m$get_output_from( 3 )
recalled_ids <- c( recalled_ids, which.max ( z ) )
}

plot(iris_data, pch=recalled_ids)

Hopefully the collection of predefined components will expand (and any contribution of components is welcomed).