12

包中的mlp方法caret调用中的mlp函数RSNNS。在RSNNS包中,我可以通过设置大小参数在神经网络中设置任意数量的隐藏层,例如

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,当我查找方法时,它只能用一个参数进行调整size,例如

data(iris)

mlpGrid <- data.frame(.size=3)
model2<-caret::train(Species~. , iris, method='mlp', tuneGrid=mlpGrid)

建立一个具有 3 节点单隐藏层的神经网络。

我试过添加其他列mlpGrid等等,但caret似乎不允许添加第二个(或更多)隐藏层。

4

2 回答 2

5

您应该使用插入“mlp”的插入符号的“ mlpML ”方法。它确实使用了 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
...
于 2017-05-02T22:38:46.247 回答
0

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

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

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

于 2015-10-28T19:28:13.757 回答