[R] RSNNS neural network for image classification in R

Valentin Pesendorfer v.p at gmx.at
Mon Mar 14 09:43:29 CET 2016


Hello everybody, 

I'm trying to harness the power of neural networks for image classification of big rasters using the `RSNNS` package in `R`.
 
As for the data preparation and training of the model, everything works perfectly fine and the accuracies look quite promising.
 
Subsequently, I'm trying to classify the raster values using the function `predict` with the trained model. Having a quite big amount of data (rasterstack with the dimension 10980x10980x16), I'm processing the data block by block. And here's the problem:
 
The prediction of the class values is extremely slow. I'm working on a quite powerful machine (Windows x64, 32GB Ram, i7 3.4GHZ quad-core) but still the process is almost literally taking ages. I already reduced the size of my blocks, but still the amount of time needed is unacceptable. Currently I split the data in blocks of 64 rows per block. That would result in a total of 172 blocks. If I assume a linear processing time for each block (in my case 33 minutes !!!), it would take me almost 95 hours to process the whole image. Again, that can not be right. 
 
I've tried other neural network packages and for instance `nnet` classifies bigger blocks like these in under one minute.
 
So please, if you have any pointers on what I'm doing wrong, I'd greatly appreciate it.


Best regards,

Valentin



 
Here's a working example similar to my code:
 
    library(RSNNS)
    
    #example data for training and testing
    dat <- matrix(runif(702720),ncol = 16)
    
    #example data to classify
    rasval <- matrix(runif(11243520),ncol = 16)
    
    dat <- as.data.frame(dat)
    
    #example class labels from 1 to 11
    classes <- matrix(,ncol=1,nrow=nrow(dat))
    classes <- apply(classes,1,function(x) floor(runif(1,0,11)))
    
    dat$classes <- classes
    
    #shuffle dataset
    dat <- dat[sample(nrow(dat)),]
    
    
    datValues <- dat[,1:16]
    datTargets <- decodeClassLabels(dat[,17])
    
    #split dataset
    dat <- splitForTrainingAndTest(datValues, datTargets, ratio=0.15)
    
    #normalize data
    dat <- normTrainingAndTestSet(dat)
    
    #extract normalization variables
    ncolmeans <- attributes(dat$inputsTrain)$normParams$colMeans
    ncolsds <- attributes(dat$inputsTrain)$normParams$colSds
    
    #train model
    model <- mlp(dat$inputsTrain, dat$targetsTrain, size=1, learnFunc="SCG", learnFuncParams=c(0, 0, 0, 0),
                 maxit=400, inputsTest=dat$inputsTest, targetsTest=dat$targetsTest)
    
    #normalize raster data
    rasval <- sweep(sweep(rasval,2,ncolmeans),2,ncolsds,'/')
    
    #Predict classes ##Problem##
    pred <- predict(model,rasval)
 


More information about the R-help mailing list