2013-05-11 14 views
8

Il metodo mlp nel pacchetto caret chiama la funzione mlp in RSNNS. Nel pacchetto RSNNS, posso impostare quanti più livelli nascosti nella rete neurale come mi piace impostando il parametro dimensione, ad es.C'è un modo per configurare una rete neurale a strati multi-nascosti con il metodo mlp nel pacchetto caret?

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) 

Configurerà una rete neurale con due livelli nascosti di 5 e 7 nodi rispettivamente. Voglio utilizzare il pacchetto caret perché ha funzionalità per eseguire ricerche di parametri/modelli, nonché implementazioni parallele per un cluster. In caret, quando cerco il metodo, può essere sintonizzato solo con un parametro, size, ad es.

Imposta una rete neurale con un singolo livello nascosto a 3 nodi.

Ho provato ad aggiungere altre colonne a mlpGrid e simili, ma non è possibile aggiungere caret per aggiungere un secondo (o più) livello nascosto.

risposta

1

È necessario utilizzare il metodo "mlpML" del punto di inserimento di "mlp". Usa la funzione mlp di RSNNS, ma sei in grado di definire separatamente il numero di neuroni per livello nascosto. Ad esempio, il seguente codice dovrebbe fare il lavoro. La griglia personalizzata viene definita con la definizione dei livelli, ogni livello (1, 2 e 3) e quanti neuroni per livello.

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) 

Dato il verboseIter=TRUE mostra che i valori sono stati effettivamente applicati

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

La risposta breve è che non credo che Caret supporti reti di layer multi-hidden utilizzando il metodo mlp.

Se si è impostato sull'utilizzo di mlp (o necessario per chiamare RSNSS), è possibile prendere in considerazione la possibilità di concatenare le reti insieme, come nel dare l'output del primo agli ingressi del secondo, simulando un altro livello nascosto. Ciò ovviamente sarebbe più difficile da implementare e perderebbe molte delle ottimizzazioni che ti fanno venire voglia di usare Caret in primo luogo.

D'altro canto, Caret offre un'alternativa che utilizza il pacchetto neuralnet (metodo = 'neuralnet'). Questo ti permetterebbe di usare Caret con una rete neurale a strati multi-nascosti. Tuttavia, dalla documentazione risulta che sono supportati solo 3 livelli nascosti.