R中栅格图像分类的RSNNS神经网络预测
Posted
技术标签:
【中文标题】R中栅格图像分类的RSNNS神经网络预测【英文标题】:RSNNS neural network prediction for raster image classification in R 【发布时间】:2016-06-26 20:38:34 【问题描述】:我正在尝试使用R
中的RSNNS
包来利用神经网络的强大功能对大栅格进行图像分类。
至于模型的数据准备和训练,一切正常,准确度看起来很有希望。
随后,我尝试使用函数predict
对经过训练的模型对栅格值进行分类。拥有大量数据(尺寸为 10980x10980x16 的栅格堆栈),我正在逐块处理数据。这就是问题所在:
类值的预测非常慢。我正在开发一台功能强大的机器(Windows x64、32GB Ram、i7 3.4GHZ 四核),但这个过程几乎确实需要很长时间。我已经减小了块的大小,但所需的时间仍然是不可接受的。目前,我将数据分成每块 64 行的块。这将导致总共 172 个块。如果我假设每个块的处理时间是线性的(在我的情况下是 33 分钟!!!),那么我需要将近 95 个小时来处理整个图像。再一次,这是不对的。
我尝试过其他神经网络包,例如 nnet
在不到一分钟的时间内对这些更大的块进行分类。
所以,如果您对我做错了什么有任何指示,我将不胜感激。
这是一个类似于我的代码的工作示例:
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)
【问题讨论】:
【参考方案1】:是的,不幸的是,RSNNS 在预测时可能非常慢。新版本 0.4-8(还没有在 CRAN 上,但你可以从 github 获得它)应该会加快速度,但普遍的问题是每一行数据都需要单独传递到 SNNS 内核中,并解决这个问题意味着在内核中重新实现一些东西。并非不可能,但有一些工作要做。
【讨论】:
以上是关于R中栅格图像分类的RSNNS神经网络预测的主要内容,如果未能解决你的问题,请参考以下文章