A Neural Network Playgroundã¨ããDeep Learningã®ãã©ã¡ã¼ã¿ãå¤ããªãããã®æåãè¦ã¦å¦ã¹ãï¼æ¥½ãããï¼ãµã¤ããTensorFlowããã¸ã§ã¯ãããã®æä¾ã§ãããã§ããããã®ãµã³ãã«ãã¼ã¿ã»ããã®4çªç®ã«ã渦巻ããµã³ãã«ãï¼å¥åãã¹ã¤ã¹ãã¼ã«ãï¼ãããã¾ãã以ä¸ã®ç»åã®å³ä¸ã®ãã¤ã§ãã
ããã£ã¦Deep NNã§ãããã¨ããã¨æå¤ã¨ãã¡ããã©ããããã§ããã確ãæå±±å çã®ã¤ã©ã¹ãæ©æ¢°å¦ç¿æ¬ã ã¨ã¬ã¦ã·ã¢ã³ã«ã¼ãã«SVMã§ãµã¯ãã¨åé¡ã§ããã¿ããã«æ¸ããã¦ããæ°ããããã¾ãã¦ã

- ä½è : æå±±å°
- åºç社/ã¡ã¼ã«ã¼: è¬è«ç¤¾
- çºå£²æ¥: 2013/09/18
- ã¡ãã£ã¢: åè¡æ¬ï¼ã½ããã«ãã¼ï¼
- ãã®ååãå«ãããã° (7件) ãè¦ã
ã¨ãããã¨ã§ãã¡ããã©ä»ãã¿åããªã®ãããã®ã§ã¡ãã£ã¨ããä½èã¨ãã¦ãã®ãã¼ã¿ã®äºå¤åé¡ããã£ã¦ã¿ããã¨æãã¾ãããªãã¹ãã¼ã¹ã®é½åä¸è©¦è¡é¯èª¤ããé¨åèªä½ã¯å²æãã¦ãã©ããªãã©ã¡ã¼ã¿ã«ãããã©ããªé¢¨ã«ãã¡ã ã£ãããç°¡åã«ã³ã¡ã³ãããã«çãã¦ããã¾ãã®ã§ãæªãããããäºæ¿ãã ããããã
ãã¼ã¿ã»ãã
ä¸å¿ãããã£ã½ããã¼ã¿ã»ãããé©å½ã«çæãã¦GitHubã«ç½®ãã¨ãã¾ãããä»åãRã§ããã®ã§ãdã¨ããååã§ãã¤ãã¦ãã¼ã¿ãã¬ã¼ã ã¨ãã¦èªã¿è¾¼ãã§ããã¦ãã ããã
é©å½ã«ããããããã¨ãããªæãã«ãªãã¾ããã¤ãã§ã«æ±ºå®å¢çãæãããã®ã°ãªãããä½ã£ã¦ããã¾ãã
> px <- seq(-4,4,0.03) > py <- seq(-4,4,0.03) > pgrid <- expand.grid(px,py) > names(pgrid) <- names(d)[-3]
SVMã§ãã£ã¦ã¿ã
æå±±æ¬ã ã¨ç°¡åã«ã§ããã¿ãããªã¤ã¡ã¼ã¸ã§æ¸ããã¦ãããã§ããããã£ã¦ã¿ãã¨æå¤ã¨ãã¾ããããªãã£ãã§ãï¼ç¬ï¼ãLIBSVMç±æ¥ã®{e1071}ã®svmã ã¨ã¬ã¦ã·ã¢ã³ã«ã¼ãã«é¸ææã®gammaãããã©ã«ãå¤ã ã¨1/ncol(x)ã«ãªããã§ãããããã ã¨æ±åãå¼·éãã¦å
¨ã渦巻ã模æ§ã«ãã£ããããªãè¬ã®æ±ºå®å¢çãæãã¾ããããã§ãå°ããããéå¦ç¿æ°å³ã«ãªãããã«ãgamma = 8ã¨ãã¦ã¿ã¾ããã
> library(e1071) > d.svm <- svm(as.factor(label)~., d, gamma=8) > out.svm <- predict(d.svm, newdata=pgrid) > plot(d[,-3], pch=19, col=d[,3]+1, cex=2, xlim=c(-4,4), ylim=c(-4,4)) > par(new=T) > contour(px, py, array(out.svm, c(length(px),length(py))), levels=0.5, drawlabels = F, col='purple', lwd=3, xlim=c(-4,4), ylim=c(-4,4))
決å®å¢çèªä½ã¯å
¨ç¶æ¸¦å·»ãã¦ããã¦ãã¾ãããï¼æ±ï¼ãã¨ããããå¦ç¿ãµã³ãã«ã綺éºã«å²ãããã«æ±ºå®å¢çãæããã¦ããã®ãåãããã¨æãã¾ãã
ã©ã³ãã ãã©ã¬ã¹ãã§ãã£ã¦ã¿ã
ä¸è¬ã«ãã®æã®æ²ç·çãªæ±ºå®å¢çãæ±ããããã·ãã¥ã¨ã¼ã·ã§ã³ã§ã¯ã©ã³ãã ãã©ã¬ã¹ãã®ãããªæ¨¹æ¨ã¢ãã«ç±æ¥ã®å¦ç¿å¨ã¯è¯ããªãã¨äºæ³ããããã§ãããããã§ãç©ã¯è©¦ãã«ãã£ã¦ã¿ã¾ãããã
> library(randomForest) > d.rf <- randomForest(as.factor(label)~., d) > out.rf <- predict(d.rf, newdata=pgrid) > plot(d[,-3], pch=19, col=d[,3]+1, cex=2, xlim=c(-4,4), ylim=c(-4,4)) > par(new=T) > contour(px, py, array(out.rf, c(length(px),length(py))), levels=0.5, drawlabels = F, col='purple', lwd=3, xlim=c(-4,4), ylim=c(-4,4))
ãããããã¡ãã£ã¨ã©ãã«ããªããã¼ã®ããï¼ç¬ï¼ãæ¡ã®å®ã樹æ¨ã¢ãã«ç¹æã®ã«ã¯ã«ã¯ãã決å®å¢çãã¢ãã«éå¦ç¿çãªå¾åã示ãã¦ãã¾ãããã¯ããã®æã®ãã¼ã¿ã»ããã«ã¯æ¨¹æ¨ã¢ãã«ç³»ã®å¦ç¿å¨ã¯ãã¡ãªããã§ãããã£ã¦xgboostãããããã¨æã£ã¦ãã¾ããããå²æãããã¨ã«ãã¾ãã
DNNã§ãã£ã¦ã¿ã
ã¨ãããã¨ã§ãNN playgroundã¨åæ§ã«DNNã§ãã£ã¦ã¿ã¾ããããã§ã¯Rã§åãã¨ãããã¨ã§ãMXnetã§ãããã¨ã«ãã¾ãï¼ãã£ã¦ã¿ããã¨ããæ¹ã¯Keras in Rã§ãè¯ãã¨æãã¾ããï¼ãããè¨ãã°ä»æ°ä»ãããã§ããã{mxnet}ã®ãã¼ã¸ã§ã³ã0.10.1ã®ã¾ã¾ã®ããã§ãããã0.11.1ã§æé©åã¨ã³ã¸ã³ãæ失é¢æ°ã®å®ç¾©ãå¢ãã¦ããã¯ããªã®ã§ãææ°ãã¼ã¸ã§ã³ã ã¨éãçµæãåºããããããã¾ããã
ããã¦çµæããå ã«æ¸ãã¦ããã¾ããããããã¡ããã¡ã試è¡é¯èª¤ããã®ã«æéãããã¾ããï¼æ±ï¼ãã¶ã£ã¡ãããlearning rateããããã«ããã£ãã ãã§å ¨ããã¿ã©ã¡ãªæ±ºå®å¢çãæãã®é£ç¶ã§ããã¤ã¾ã§çµã£ã¦ããã¾ãå¦ç¿ããªãï¼ã»ãã®0.001å¤ããã ãã§training accuracyã0.5ã¨ãã²ã©ãã¨0.39ã¨ãã«å¼µãä»ãã¦å¤ãããªãã¿ãããªç¶æ³ãè¦ãããï¼ãããã¯å®ã¯NN Playgroundã§ãæ確ã«è¦ãããç¾è±¡ã§ãããããå¦ç¿ä¸ããªããªã渦巻ãç¶ã®å¦ç¿ãµã³ãã«ã«ãã¡ãã¨ã¢ãã«ã追éããªããã§ãããããªã®ã§æ£ç´ä»¥ä¸ã®çµæãåºããã¨ããã§å¿ãæãã¾ããããã
> library(mxnet) > train.x <- data.matrix(d[,-3]) > train.y <- d[,3] > test <- data.matrix(pgrid) > data <- mx.symbol.Variable("data") > fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=5) > act1 <- mx.symbol.Activation(fc1, name="tanh1", act_type="tanh") > fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=5) > act2 <- mx.symbol.Activation(fc2, name="tanh2", act_type="tanh") > fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=5) > act3 <- mx.symbol.Activation(fc3, name="tanh3", act_type="tanh") > fc4 <- mx.symbol.FullyConnected(act3, name="fc4", num_hidden=2) > softmax <- mx.symbol.SoftmaxOutput(fc4, name="softmax") > devices <- mx.cpu() > mx.set.seed(71) > model <- mx.model.FeedForward.create(softmax, X=train.x, y=train.y, ctx=devices, num.round=2000, array.batch.size=10, learning.rate=0.0008, momentum=0.99, eval.metric=mx.metric.accuracy, initializer=mx.init.uniform(0.5), array.layout = "rowmajor", epoch.end.callback=mx.callback.log.train.metric(100)) > preds <- predict(model, test, array.layout = "rowmajor") > pred.label <- max.col(t(preds)) - 1 > plot(d[,-3], pch=19, col=d[,3]+1, cex=2, xlim=c(-4,4), ylim=c(-4,4)) > par(new=T) > contour(px, py, array(pred.label, c(length(px),length(py))), levels=0.5, drawlabels = F, col='purple', lwd=3, xlim=c(-4,4), ylim=c(-4,4))
ã¨ãããã¨ã§ãDNNã®ãå©çãå ¨ãæããããªãçµæã«ãªãã¾ããï¼æ³£ï¼ãã¡ãªã¿ã«NN Playgroundã§ãã£ã¦ããã¾ããããã¨ã£ã¦ãã¾ãå¤ããªãã¦ããããããã§ãã¾ããã£ããã©ã¡ã¼ã¿è¨å®ãMXnetã«çªã£è¾¼ãã§ãåç¾ããªãorz ã©ããããã¨ã§ããããã
ãªããä¸2ã¤ã«ããã£ãæéã¯ãã£ãã®10åãDNNã§ããã¾ã§ãã¥ã¼ãã³ã°ããã®ã«ããã£ãæéã¯2æéåã§ãããTrain accuracyã0.8ã¡ãã£ã¨ãéçã§ããã以ä¸ã¯ä¸ãããã
æå¾ã«
åã¯ããããããå©ãã使ããã¨ãå¤ãã®ã§ããã
- å¾æ¥åã®æ©æ¢°å¦ç¿ã¯ãèªåè»ã«å©ããã°ã»ãã³ãç¹ã«ä½ã工夫ããªãã¦ãç°¡åã«è¡ä¸ãèµ°ããããã¹ãã¼ããåºããã¨ããã¨éçããã
- Deep Learningã¯ãèªåè»ã«å©ããã°F1ã¬ã¼ã·ã³ã°ã«ã¼ãæã¦ããªãéãã¹ãã¼ããåºããã¨ãåºæ¥ããããã¥ã¼ãã³ã°ãé£ãã
ãã®å©ããå°ã§è¡ããããªä½èã®çµæã«ãªãã¾ãããããDeep Learningãé©æé©æãã¨ãããã¨ã§ã
追è¨1
@kazunori_279ããããã¤ãNN Playgroundã®ãã¢ã§ä½¿ã£ã¦ããã¨ããè¨å®ãåèã«ã以ä¸ã®ããã«å¤ãã¦ã¿ã¾ããã
> data <- mx.symbol.Variable("data") > fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=8) > act1 <- mx.symbol.Activation(fc1, name="relu1", act_type="relu") > fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=8) > act2 <- mx.symbol.Activation(fc2, name="relu2", act_type="relu") > fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=5) > act3 <- mx.symbol.Activation(fc3, name="relu3", act_type="relu") > fc4 <- mx.symbol.FullyConnected(act3, name="fc4", num_hidden=2) > softmax <- mx.symbol.SoftmaxOutput(fc4, name="softmax") > devices <- mx.cpu() > mx.set.seed(71) > model <- mx.model.FeedForward.create(softmax, X=train.x, y=train.y, ctx=devices, num.round=3000, array.batch.size=10, learning.rate=0.0008, momentum=0.99, eval.metric=mx.metric.accuracy, initializer=mx.init.uniform(0.5), optimizer='sgd', array.layout = "rowmajor", epoch.end.callback=mx.callback.log.train.metric(100)) > preds <- predict(model, test, array.layout = "rowmajor") > pred.label <- max.col(t(preds)) - 1 > plot(d[,-3], pch=19, col=c(rep(1,100),rep(2,100)), cex=2, xlim=c(-4,4), ylim=c(-4,4)) > par(new=T) > contour(px, py, array(pred.label, c(length(px),length(py))), levels=0.5, drawlabels = F, col='purple', lwd=3, xlim=c(-4,4), ylim=c(-4,4))
å¤å°ã¹ã¤ã¹ãã¼ã«ã£ã½ãã¯ãªãã¾ãããããunitæ°ã8ã¨ãã£ã¦çµæ§ãã®ã·ãã¥ã¨ã¼ã·ã§ã³ã ã¨è²ã
è¿·ãæãã§ãããããã
追è¨2
ä½ãè
¹ãç«ã£ã¦ããã®ã§ï¼ç¬ï¼ã{keras}ã¤ã¾ãKeras in Rã§ãã£ã¦ã¿ã¾ããã
> library(keras) > model <- keras_model_sequential() model %>% layer_dense(units=8, input_shape=2) %>% layer_activation(activation='relu') %>% layer_dense(units=8) %>% layer_activation(activation='relu') %>% layer_dense(units=5) %>% layer_activation(activation='relu') %>% layer_dense(units=1, activation='sigmoid') model %>% compile( loss='binary_crossentropy', optimizer=optimizer_sgd(lr=0.03), metric=c('accuracy') ) > model %>% fit(train.x, train.y, epoch=1500, batch_size=10) > pred_class <- model %>% predict(test, batch_size=10) > pred_class <- round(pred_class,0) > plot(d[,-3], pch=19, col=c(rep(1,100),rep(2,100)), cex=2, xlim=c(-4,4), ylim=c(-4,4)) > par(new=T) > contour(px, py, array(pred_class, c(length(px),length(py))), levels=0.5, drawlabels = F, col='purple', lwd=3, xlim=c(-4,4), ylim=c(-4,4))
ã¹ã¤ã¹ãã¼ã«ã«ã¯ãªããã§ããããã£ã±ãå¦ç¿ãåæãåãã¦ãªãã§ãããããã
追è¨3
ä¸å¿ãNN Playgroundでうまくいった時の設定ãè²¼ã£ã¦ããã¾ããæ¬å½ã¯ããã§ãã¾ãããã¯ããªãã§ãããããï¼æ±ï¼