アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

Ver1.20で追加された「ユニット機能」を使ってみる/使い方37/Neural Network Console

Neural Network Console(ニューラルネットワークコンソール:以後nnc)のバージョンが1.20になり、新機能として「ユニット機能」が追加されました。

dl.sony.com

  これは、例えば、以下のような複数のレイヤーの組み合わせをひとまとめにして名前をつけて、再利用できる機能です。

f:id:arakan_no_boku:20180622075356j:plain

チュートリアルがあるので、それを見ながら試してみます。

support.dl.sony.com

 

まずは、プロジェクト内でユニットを作ってみる

nncを立ち上げて、新しいプロジェクトを作ってやってみます。

f:id:arakan_no_boku:20180622232653j:plain

最初にユニットを作ります。

EDITタブで「+」ボタンを押します。

f:id:arakan_no_boku:20180622233008j:plain

 

新規タブができるので、適当なユニット名に変更します。 

今回は、とりあえず「CnnUnit」にしてみました。

f:id:arakan_no_boku:20180622233452j:plain

 

それでユニットとしてまとめたいレイヤーを「CnnUnit」タブに設定していくわけですが、必ず「Input」レイヤーが必要です。

f:id:arakan_no_boku:20180622233945j:plain

 

使いまわしたいのは、「Convolution」「MaxPooling」「ReLu」のセットだけなんですが、Inputをつけないとエラーになるので仕方ありません。 

でも、どうやら、このInputはダミーっぽいです。 

確認のため、実際に利用するInputは「MINIST」なので「1,28,28」のところ、あえて「1,64,64」に変えてみましたが、これで問題なく実行できますから。 

さすがに「1,5」みたいに次元を変えると、Convolution以下のレイヤーがエラーになるので無理ですが、次元があってれば、あまり神経質になる必要はないのかなという気はしますね。

 

Mainタブでユニットを使う

利用したいところに、UNITコンポーネントをドロップします。

f:id:arakan_no_boku:20180622235145j:plain

 

そのUnitの「Network」プロパティに、定義したユニットの名前(今回ならCnnUnit)を入力すれば良いです。

f:id:arakan_no_boku:20180622235610j:plain

 

それ以外は普通にレイヤーを重ねていきます。

f:id:arakan_no_boku:20180623000043j:plain

 

これで保存すれば、とりあえず学習できます。

f:id:arakan_no_boku:20180623000442j:plain

 

わずか10Epochしか学習してませんが、Accuracy 99.01%は結構なもんです。

f:id:arakan_no_boku:20180623000549j:plain

 

ユニットにパラメータ(引数)を追加してみる

 

無理に使わなくても、上記みたいに使えますが、引数としてパラメータを使うこともできます。 

Argumentというコンポーネントを使います。

f:id:arakan_no_boku:20180623001452j:plain

 

ユニットタブにいくつでもドロップできるみたいです。 

ドロップしたら、名前(Name)と型(Type)と初期値(Value)をプロパティに入力します。

f:id:arakan_no_boku:20180623002210j:plain

 

Typeは表示される選択肢から選びます。 

レイヤーリファレンスにも書いてありますが、よく使いそうなものだけ、ちょっと補足して引用します。

Boolean:True or False
Int:整数(例: 0)
IntArray:整数の配列(例:0,0)
PInt:1以上の整数(例:1)
PIntArray:1以上の整数の配列(例:1,28,28)
Float:浮動小数点数(例: 0.5)
FloatArray:浮動小数点数の配列(例: 0.3,0.5)
Text:文字列
File:ファイル名

 

あとは、各レイヤーのプロパティで、作成したパラメータの名前の前に「*」をつけて数字の代わりに入力すれば、いいです。

f:id:arakan_no_boku:20180623003458j:plain

 

そうしとくと、Mainタブで定義したUnitのプロパティに定義した「Argument」の名前がでてくるので、そこで任意の値に変更すればいいです。

f:id:arakan_no_boku:20180623003858j:plain

 

と・・まあ、こんな感じで使えます。 

まさしく、プログラムでいう関数とかサブルーチン的なもの・・ですかね。

 

微妙だなあと思った点があります

 

使える・・のですけど、正直微妙だなと思った点があります。 

ユニット機能と聞いて、最初は「LSTN」みたいな組み込みユニットを作れるようになったのかと期待しました。 

nncが狙うべきターゲットは「ディープラーニングをビジネスに応用したいけれど、ガチな研究者ではない人たち」だと、個人的には思ってます。 

だから、分類や予測の精度を追求するのではなく、とりあえず試したいというニーズは絶対的にあるはずだと。 

だから、LSTNみたいな組み込みユニットを増やしていくことが必要で、かつ、それらを自分で拡張していけるようになれば良いと思っていたわけです。 

ですが、どうも今回のユニット機能はプロジェクトをまたいで使えませんし、組み込みユニットも増えてません。 

そのへんはちょっと残念ではありますね。