鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

MacでAI::MXNetを動かして見た

公式ドキュメントを見ながらやってみる
http://mxnet.io/get_started/osx_setup.html#build-the-shared-library
Perlが公式ドキュメントにありテンションが上がる。

exampleを実行してみる

cd ~/mxnet/perl-package/AI-MXNet/examples/
perl mnist.pl 

動いたようだ!

折角だシンボルAPIを試してみよう

use AI::MXNet qw('mx');
$aaa = mx->symbol->Variable("aaa");
$bbb = mx->symbol->Variable("bbb");
$c = $aaa + $bbb;
$nd1 = mx->nd->array([1,2]);
$nd2 = mx->nd->array([3,4]);
$executor = $c->bind(ctx => mx->Context('cpu'), args=> [$nd1, $nd2]);
$result = $executor->forward();
print $result->[0]->aspdl();
[4,6]

SYNOPSISの方のMINISTを動かしてみる

dataフォルダに以下の4ファイルを格納しておく
t10k-images.idx3-ubyte
t10k-labels.idx1-ubyte
train-images.idx3-ubyte
train-labels.idx1-ubyte

あとはsynopsisのファイルをtest.plとして格納して実行するだけで動きました。
wgetほにゃららとでていて、ネットからダウンロードしようとしているのかな??

$ perl test.pl 
1..1
Can't exec "wget": No such file or directory at /Users/dokechin/perl5/lib/perl5/AI/MXNet/TestUtils.pm line 85.
unzip:  cannot find or open mnist.zip, mnist.zip.zip or mnist.zip.ZIP.
[20:50:08] src/io/iter_mnist.cc:94: MNISTIter: load 60000 images, shuffle=1, shape=(100,1,28,28)
[20:50:09] src/io/iter_mnist.cc:94: MNISTIter: load 10000 images, shuffle=1, shape=(100,1,28,28)
Epoch[0] Train-accuracy=0.657233
Epoch[0] Time cost=9.599
Epoch[0] Validation-accuracy=0.944500
ok 1

SYNOPSYSのモデルを簡略化してみたけど

accuracyは変わらない。むしろ良くなっている?

### model
  my $data = mx->symbol->Variable('data');
### 畳み込み
  my $conv1= mx->symbol->Convolution(data => $data, name => 'conv1', num_filter => 32, kernel => [3,3], stride => [2,2]);
### バッチ正規化
  my $bn1  = mx->symbol->BatchNorm(data => $conv1, name => "bn1");
### 活性化関数
  my $act1 = mx->symbol->Activation(data => $bn1, name => 'relu1', act_type => "relu");
  my $mp1  = mx->symbol->Pooling(data => $act1, name => 'mp1', kernel => [2,2], stride =>[2,2], pool_type=>'max');
   
  my $fl   = mx->symbol->Flatten(data => $mp1, name=>"flatten");
  my $fc1  = mx->symbol->FullyConnected(data => $fl,  name=>"fc1", num_hidden=>30);
  my $act3 = mx->symbol->Activation(data => $fc1, name=>'relu3', act_type=>"relu");
  my $fc2  = mx->symbol->FullyConnected(data => $act3, name=>'fc2', num_hidden=>10);
  my $softmax = mx->symbol->SoftmaxOutput(data => $fc2, name => 'softmax');