モノクロタイム

I'm from the future!

【vvvv】vvvvでDeepLearning【DeepLearning】

こんにちは,れいじです.

最近はvvvvに傾倒しすぎてDeepLearning系の記事を書いてませんでした.久しぶりにDeepLearningの記事を書きますが,修士論文では常にDeepLearningをモグモグしていました.因みにCNNを使用して画素単位での輪郭線抽出とかやってました.

DeepLearningというワードでこの記事に行き着いた人もいるかと思うので,本記事で使用するvvvvというツールについて軽く説明をします.

vvvvとは

vvvv - a multipurpose toolkit | vvvv

vvvv(ブイブイブイブイ/ブイフォー)はビジュアルプログラミング言語の一種で,主にマルチメディア制作にスキルを全振りしている開発環境です.このブログにはvvvvので作成したCGやvvvvの各ノード(関数)について解説している記事がいくつかあるので,そちらも参考にしてみて下さい.

また,Youtubeにてvvvvの使い方を解説した動画があります.とてもわかりやすいのでこちらもぜひ.

vvvvのインストール方法については,Downloads | vvvvを参考にして下さい.

vvvvでDeepLearningを触ってみる

DeepLearningとは日本語で深層学習と訳され,現在話題沸騰中の機械学習モデルです.

最近の例でいくと,PaintsChainerFaceAppとかが主な活用事例になります.

2014年辺りからCaffeChainerなどのDeepLearningライブラリが提供され始め,今はDeepLearningやってみたいな〜と思ったらスッと始められる環境にあります.因みに修論ではCaffeを使ってあれこれしてました.

ライブラリの提供範囲はPythonC++辺りから徐々に広がり始め,vvvvでも有志によってDeepLearningを扱うためのアドオンパックが開発されました.

vvvv.org

C#機械学習ライブラリAccord.Net Frameworkを使用して開発されています.

導入方法としては,上記URLのDownloadからVVVV.Packs_.MachineLearning_x86_v0.1.2.zip を落としてきて解凍します.vvvv.exeと同一ディレクトリ内に「packs」という名前のディレクトリを作成し,その中に解凍した中身を入れてください.

f:id:yomoyamareiji:20170203172811j:plain

packsディレクトリの中身はこんな感じ.

f:id:yomoyamareiji:20170203172917j:plain

私は32bit版を落としてきていますが,これは私の導入しているvvvvが32bit版であるからです.64bit版のvvvvを導入している場合は,x64の方を導入して下さい(vvvv本体とアドオンパックのbitバージョンが揃ってないと動きません!)

見てて楽しいサンプルパッチ

VVVV.Packs.MachineLearningにはgirlpower(=サンプルパッチ群)が入っており,サンプルパッチを参考にしながらプログラムを作ることができます.

パッと見で面白いのは「face_recognition.v4p」です.名前のとおり,USBカメラで撮影した画像の中から顔を検出するパッチです.

SVM_Classification-YinYan.v4p」はSVMを使用したクラス分類を行うサンプルパッチです.YinYanとはタイチーマークの事です.

f:id:yomoyamareiji:20170203174758j:plain

DeepBeliefNetworkのサンプルパッチについて

上のサンプルパッチと同じ場所に,「DeepBeliefNetworks.v4p」というサンプルパッチがあります.Deep Belief Network(DBN)はRistricted Boltzmann Machine(RBN)を多層化したモデルで,2006年にG.Hinton氏によって考案されました.少し古い記事ではありますが,まとまっていて読みやすいです.ぜひ.

qiita.com

サンプルパッチがちょっとわかりにくいので少し解説してみようと思います.このパッチは教師あり学習を行うDBNのサンプルです.

上でも記述したとおり,このライブラリの大元はAccord .Net Frameworkなので,Accord .Net Frameworkの作法を覚えておく必要があります.この辺については以下の記事が参考になります.

qiita.com

学習データと教師データ

まずはサンプルパッチの上部を見ていきましょう.

f:id:yomoyamareiji:20170204222103j:plain

Trainingパッチに繋がる部分には,学習用データと教師データを接続します.青枠部分で囲っているのが学習用データで,ピンク枠で囲っているのが教師用データになります.学習用データは11個存在し,それぞれ違う値を取っています.例えば一番左の学習用データを配列風に書くと{1,0,0,1}といったような感じになります.

学習用データに付随する教師データが11個存在し,学習用データの中で一番左側に存在するデータに対しては{1,0}のラベルが付けられています.残りの11個に対しては{0,1}のラベルが付けられています.つまり,学習データは{1,0}か{0,1}のどちらかのクラスに属していることになります.

DBNは学習用データとラベルデータとの関係を学習して,入力された未知のデータに対し,データがどちらのクラスに近いかを判定します.

Trainingノード

次にTrainingノードを見ていきましょう.

f:id:yomoyamareiji:20170204223100j:plain

元々ノードにキャプションが振られているのでわかりやすいです.機械学習畑の方ではない人の為に,用語の説明を簡単にしておきます.

  • Hidden Neurons : 隠れ層と出力層の数.分類するクラス数が2なので,出力層は2

  • Epochs : 学習回数

  • Batch Size : ネットワーク内のパラメータを更新するときに使用するデータの数.学習するデータの数が膨大になってくると,この辺の調整が必要になってくる

  • Learning Rate : 学習率.0.01辺りがよく使われる.けどこのパッチでは0.1を使っている

  • Weight decay : 重み減衰.学習が進むにつれて,パラメータ内の不要or過剰な重みを取り除く役割を担う.ネットワークをもっと多層化する場合はこの変の調整も視野に入れる

  • Train Layer : 指定した学習データと教師データで学習を行うときはここを右クリック

このサンプルパッチではバッチサイズ~重み減衰辺りはあまり深く考えなくてもいい気がします.

Classifyノード

学習したDBNを使用して,実際にデータを入力してクラス判定を行うことが可能です.Classifyのボタンを右クリックすると,入力データに対するクラス分類を行います.

f:id:yomoyamareiji:20170204225604j:plain

GetSliceの値は学習データとリンクしています.今0番目を指定しているので,学習データの一番左のデータを指し示しています.

下のClassとキャプションが振られている部分がクラス分類結果になります.結果は確率値で表されます.

学習データの0番目({1,0,0,1})はラベルが{1,0}であったので,分類結果は(ギリギリ)正解です.

f:id:yomoyamareiji:20170204230016j:plain

5番目の学習データを指定してみました.5番目の学習データはラベルが{0,1}であったので,分類結果は成功です.

GetSliceのエッジとChangeのエッジを切ると,未知の学習データに対する判定を行うことが出来ます.

f:id:yomoyamareiji:20170204234043j:plain

こんな感じ.

右下のこれですが…

f:id:yomoyamareiji:20170204234117j:plain

あまり明確に役割が分からないです.隠れ層の可視化?わからないなぁ.何か知っている方はコメント欄で教えていただけると助かります.

DLライブラリの活用について

DBNのサンプルパッチでは数値データを使用した学習及びクラス分類を行っているのですが,ImagePackと合わせるとvvvvを使用したDeepLearningでの画像認識も可能になるのかな?とか考えております.(FaceTrackingもUSBカメラの画像を持ってきて顔認識してるので…)

もう少しサンプルパッチを使用して勉強してみたいと思っています.

ではでは~

[asin:B01B768QJW:detail]