渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

h2o.deeplearningでクリスマスツリー(のようなもの)を描く

R Advent Calendar 2014 (ATND)のクリスマス・イヴ担当ということで、クリスマスツリーを描いてみます。



まずは去年もやったSVMで、ついでにちょっとだけホワイト・クリスマス感を出してみた感じで。クリスマスツリーのデータはGitHubから落としてきて、dtという名前でインポートしておきます。

> library(e1071)
> px<-seq(-3,3,0.3)
> py<-seq(-3,3,0.3)
> pgrid<-expand.grid(px,py)
> names(pgrid)<-c('x','y')
> dt<-read.delim('xmastree_dt.txt')
> dt.svm<-svm(label~.,dt)
> out.dt.svm<-predict(dt.svm,newdata=pgrid)
> plot(0,0,xlim=c(-3,3),ylim=c(-3,3))
> rect(-3,-3,3,3,col='black')
> points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2)
> par(new=T)
> contour(px,py,array(out.dt.svm,dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)

f:id:TJO:20141217120329p:plain


去年よりちょっとだけクリスマス気分が増しましたかね? ということで、今度は{h2o}のDeep Learningで同じようにクリスマスツリーを描いてみようと思います!


まずは隠れ層を10ユニット4層にして活性化関数はTanhという比較的シンプルなパラメータのセットで。

> write.table(pgrid,file='pgrid33.txt',quote=F,col.names=T,row.names=F,sep='\t')
> library(h2o)
> localH2O <- h2o.init(ip = "localhost", port = 54321, startH2O = TRUE, nthreads=6)
> xmData<-h2o.importFile(localH2O,path='xmastree_dt.txt')
> pgData<-h2o.importFile(localH2O,path='pgrid33.txt')
> dt.dl<-h2o.deeplearning(x=1:2,y=3,data=xmData,activation='Tanh',hidden=c(10,10,10,10),epochs=5)
> out.dt.dl<-h2o.predict(dt.dl,newdata=pgData)
> out.dt.dl.df<-as.data.frame(out.dt.dl)
> plot(0,0,xlim=c(-3,3),ylim=c(-3,3))
> rect(-3,-3,3,3,col='black')
> points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2)
> par(new=T)
> contour(px,py,array(out.dt.dl.df[,1],dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)

f:id:TJO:20141217120917p:plain


全然ダメじゃんorz もうちょっと色々試してみました。今度は隠れ層を6ユニット6層にしてNesterov accelerated gradientをオンにし、さらに学習係数周りのパラメータもつけてみました。

> dt.dl<-h2o.deeplearning(x=1:2,y=3,data=xmData,activation='Tanh',hidden=rep(6,6),epochs=200,nesterov_accelerated_gradient = T,fast_mode=T,rate_decay = 1.0, momentum_start = 0.5,momentum_ramp = 5000, momentum_stable = 0.99,rate=0.01, rate_annealing = 1.0e-9)
> out.dt.dl<-h2o.predict(dt.dl,newdata=pgData)
> out.dt.dl.df<-as.data.frame(out.dt.dl)
> plot(0,0,xlim=c(-3,3),ylim=c(-3,3))
> rect(-3,-3,3,3,col='black')
> points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2)
> par(new=T)
> contour(px,py,array(out.dt.dl.df[,1],dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)

f:id:TJO:20141217121924p:plain


木になってねーよコラ。もうちょっとさらに色々変えてみます。今度は活性化関数をRectifierに変え、隠れ層を6ユニット10層に変えて複雑な曲がりくねりに対応できるようにして、さらにrate_annealingナシにしてみました。

> dt.dl<-h2o.deeplearning(x=1:2,y=3,data=xmData,activation='Rectifier',hidden=rep(6,10),epochs=200,nesterov_accelerated_gradient = T,fast_mode=T,rate_decay = 1.0, momentum_start = 0.5,momentum_ramp = 5000, momentum_stable = 0.99,rate=0.01, rate_annealing = 0)
> out.dt.dl<-h2o.predict(dt.dl,newdata=pgData)
> out.dt.dl.df<-as.data.frame(out.dt.dl)
> plot(0,0,xlim=c(-3,3),ylim=c(-3,3))
> rect(-3,-3,3,3,col='black')
> points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2)
> par(new=T)
> contour(px,py,array(out.dt.dl.df[,1],dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)

f:id:TJO:20141217122624p:plain


えらく大ざっぱな木になったな、というかこれじゃダースベイダーの輪郭じゃないか。。。そもそも複雑な曲がりくねりに対応できてないままだし。。。ともあれメリークリスマス!(滝汗)