2013-05-11 11 views
8

Metoda w pakiecie caret wywołuje funkcję mlp w RSNNS. W pakiecie RSNNS mogę ustawić dowolną liczbę ukrytych warstw w sieci neuronowej, tak jak lubię, ustawiając parametr wielkości, np.Czy istnieje sposób na skonfigurowanie sieci neuronowej z wieloma ukrytymi warstwami za pomocą metody mlp w pakiecie z maską?

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) 

Skonfiguruje sieć neuronową z dwiema ukrytymi warstwami odpowiednio 5 i 7 węzłów. Chcę użyć pakietu caret, ponieważ ma on funkcjonalność do wyszukiwania parametrów/modeli, a także równoległe implementacje dla klastra. W przypadku caret, gdy sprawdzam metodę, można ją dostroić tylko za pomocą jednego parametru: size, np.

data(iris) 

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

Ustawia sieć neuronową z 3-węzłową pojedynczą warstwą ukrytą.

Próbowałem dodać inne kolumny do mlpGrid i takie, ale wydaje się, że caret nie pozwala na dodanie drugiej (lub więcej) ukrytej warstwy.

Odpowiedz

1

Powinieneś użyć metody caret "mlpML" wstawionej w "mlp". Używa funkcji MLP z RSNNS, ale możesz zdefiniować liczbę neuronów na ukrytą warstwę osobno. Na przykład poniższy kod powinien wykonać pracę. Definiujesz swoją własną siatkę z definicją twoich warstw, każdej warstwy (1, 2 i 3) oraz ile neuronów przypada na warstwę.

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) 

Uwzględniając verboseIter=TRUE to pokazuje, że wartości były rzeczywiście stosowane

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

Krótka odpowiedź brzmi: nie wierzę, że Caret obsługuje wielowidokowe sieci warstw przy użyciu metody mlp.

Jeśli używasz MLP (lub potrzebujesz wywołania RSNSS), możesz rozważyć połączenie sieci, tak jak przy podawaniu wyjścia pierwszego do wejść drugiego, symulując inną ukrytą warstwę. To oczywiście będzie trudniejsze do wdrożenia i straci wiele optymalizacji, które sprawią, że będziesz chciał używać Careta w pierwszej kolejności.

Z drugiej strony, Caret oferuje alternatywę, która wykorzystuje pakiet neuralnet (method = 'neuralnet'). Umożliwi to korzystanie z kamery Caret z wielo ukrytą siecią neuronową. Z dokumentacji wynika jednak, że obsługiwane są tylko 3 ukryte warstwy.