Search code examples
rplotneural-networkcran

Plotting neural network model from nnet package R cran


Is there any package or other software to plot neural network models from the nnet package cran.

I trained a neural network model (3 inputs and 1 output) using nnet and Rattle:

crs$nnet <- nnet(as.factor(Target) ~ .,
                 data=crs$dataset[crs$sample,c(crs$input, crs$target)],
                 size=10, skip=TRUE, MaxNWts=10000, 
                 trace=FALSE, maxit=100)

This was the summary of the model :

Neural Network build options: skip-layer connections; entropy fitting.

In the following table:
   b  represents the bias associated with a node
   h1 represents hidden layer node 1
   i1 represents input node 1 (i.e., input variable 1)
   o  represents the output node

Weights for node h1:
 b->h1 i1->h1 i2->h1 i3->h1 
 -0.66   0.15   0.24  -0.31 

Weights for node h2:
 b->h2 i1->h2 i2->h2 i3->h2 
 -0.62   1.32   1.16   0.24 

Weights for node h3:
 b->h3 i1->h3 i2->h3 i3->h3 
 13.59 -10.44   0.78  -6.46 

Weights for node h4:
 b->h4 i1->h4 i2->h4 i3->h4 
  0.16  -0.46   2.09   0.23 

Weights for node h5:
 b->h5 i1->h5 i2->h5 i3->h5 
 -0.16  -0.55  -0.52   0.25 

Weights for node h6:
 b->h6 i1->h6 i2->h6 i3->h6 
 -1.49  -7.07   1.67  -0.21 

Weights for node h7:
 b->h7 i1->h7 i2->h7 i3->h7 
  2.00   1.67  -5.51   0.66 

Weights for node h8:
 b->h8 i1->h8 i2->h8 i3->h8 
  0.56   0.44   0.41   0.51 

Weights for node h9:
 b->h9 i1->h9 i2->h9 i3->h9 
  0.38   0.21   0.47  -0.41 

Weights for node h10:
 b->h10 i1->h10 i2->h10 i3->h10 
   0.53   -1.60    4.79   -0.04 

Weights for node o:
  b->o  h1->o  h2->o  h3->o  h4->o  h5->o  h6->o  h7->o  h8->o  h9->o 
  1.08   1.83   0.17   1.21   1.21   0.64  -0.13  -8.37   0.98   2.03 
h10->o  i1->o  i2->o  i3->o 
 -8.41   0.03   0.00   0.01 

Thank you very much


Solution

  • Thanks to "R is my friend", now you can easily do that:

    http://beckmw.wordpress.com/2013/11/14/visualizing-neural-networks-in-r-update/

    I forked the function made by fawda123 and added the possibility to change border color as well. My changes are available here:

    https://gist.github.com/Peque/41a9e20d6687f2f3108d

    Example with custom border color (black):

    Neural network plot example

    Here is the complete code of the example above (notice you will need packages 'clusterGeneration', 'nnet' and 'devtools'):

    library(clusterGeneration)
    library(nnet)
    library(devtools)
    
    seed.val<-2
    set.seed(seed.val)
    
    num.vars<-8
    num.obs<-1000
    
    #input variables
    cov.mat<-genPositiveDefMat(num.vars,covMethod=c("unifcorrmat"))$Sigma
    rand.vars<-mvrnorm(num.obs,rep(0,num.vars),Sigma=cov.mat)
    
    #output variables
    parms<-runif(num.vars,-10,10)
    y1<-rand.vars %*% matrix(parms) + rnorm(num.obs,sd=20)
    parms2<-runif(num.vars,-10,10)
    y2<-rand.vars %*% matrix(parms2) + rnorm(num.obs,sd=20)
    
    #final datasets
    rand.vars<-data.frame(rand.vars)
    resp<-data.frame(y1,y2)
    names(resp)<-c('Y1','Y2')
    dat.in<-data.frame(resp,rand.vars)
    
    #nnet function from nnet package
    set.seed(seed.val)
    mod1<-nnet(rand.vars,resp,data=dat.in,size=10,linout=T)
    
    #import the function from Github
    source_url('https://gist.githubusercontent.com/Peque/41a9e20d6687f2f3108d/raw/85e14f3a292e126f1454864427e3a189c2fe33f3/nnet_plot_update.r')
    
    #plot each model
    pdf('./nn-example.pdf', width = 7, height = 7)
    plot.nnet(mod1, alpha.val = 0.5, circle.col = list('lightgray', 'white'), bord.col = 'black')
    dev.off()