有没有办法在插入符号包中使用mlp方法设置多隐藏层神经网络?

时间:2013-05-11 07:53:29

标签: r machine-learning neural-network prediction r-caret

caret中的mlp方法调用RSNNS中的mlp函数。在RSNNS包中,我可以通过设置size参数在神经网络中设置尽可能多的隐藏层,例如

data(iris)

#shuffle the vector
iris <- iris[sample(1:nrow(iris),length(1:nrow(iris))),1:ncol(iris)]

irisValues <- iris[,1:4]
irisTargets <- decodeClassLabels(iris[,5])
#irisTargets <- decodeClassLabels(iris[,5], valTrue=0.9, valFalse=0.1)

iris <- splitForTrainingAndTest(irisValues, irisTargets, ratio=0.15)
iris <- normTrainingAndTestSet(iris)

model <- mlp(iris$inputsTrain, iris$targetsTrain, size=c(5,7), learnFuncParams=c(0.1), 
             maxit=50, inputsTest=iris$inputsTest, targetsTest=iris$targetsTest)

将建立一个神经网络,分别有5个和7个节点的两个隐藏层。我想使用caret包,因为它具有执行参数/模型搜索的功能,以及群集的并行实现。在caret中,当我查找方法时,只能使用一个参数[{1}}进行调整,例如

size

设置具有3节点单隐藏层的神经网络。

我已尝试将其他列添加到data(iris) mlpGrid <- data.frame(.size=3) model2<-caret::train(Species~. , iris, method='mlp', tuneGrid=mlpGrid) 等,但mlpGrid似乎不允许添加第二个(或更多)隐藏图层。

2 个答案:

答案 0 :(得分:4)

你应该使用插入符号&#34; mlpML&#34;方法是&#34; mlp&#34;。它确实使用来自RSNNS的mlp函数,但是你可以分别定义每个隐藏层的神经元数量。例如,以下代码应该完成工作。您可以使用图层的定义,每个图层(123)以及每个图层的神经元数量来定义自定义网格。

mlp_grid = expand.grid(layer1 = 10,
                       layer2 = 10,
                       layer3 = 10)

mlp_fit = caret::train(x = train_x, 
                y = train_y, 
                method = "mlpML", 
                preProc =  c('center', 'scale', 'knnImpute', 'pca'),
                trControl = trainControl(method = "cv", verboseIter = TRUE, returnData = FALSE),
                tuneGrid = mlp_grid)

鉴于verboseIter=TRUE它表明确实应用了值

+ Fold01: layer1=10, layer2=10, layer3=10 
+ Fold02: layer1=10, layer2=10, layer3=10 
+ Fold03: layer1=10, layer2=10, layer3=10
...

答案 1 :(得分:0)

简短的回答是,我不相信Caret使用mlp方法支持多隐藏层网络。

如果您已开始使用mlp(或者需要它来调用RSNSS),那么您可能会考虑将网络链接在一起,如将第一个输出馈送到第二个输入中,模拟另一个隐藏层。这显然更难以实现,并且失去了许多使你想要首先使用Caret的优化。

另一方面,Caret提供了一种使用神经网络包的方法(方法=&#39; neuralnet&#39;)。这将允许您使用Caret与多隐藏层神经网络。但是从文档中可以看出只支持3个隐藏层。