鈍足ランナーのIT日記

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

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

PerlでMNISTを画像ファイルでやりたい

AI::MXNetを最近使って機械学習を勉強中。
0-9の手書き文字の認識するサンプルMNISTはサンプルコードもあるのですが
MNISTデータは28*28次元のバイナリデータでして、応用しようとしても
そのままだと使いづらい、画像データ(pngなど)でやりたいのです。

Githubを調べた結果MNISTのバイナリデータをpngに変換するツールがありました。
github.com

pngファイルになりますので。コントロールファイル形式(パス一覧のようなもの)のファイルをperlスクリプトで作りました。

use strict;
use warnings;

open my $train, ">./training.ctl";
open my $test, ">./testing.ctl";
my @png = glob "./*/*/*.png";
for my $png(@png){
  $png =~ /(training|testing)\/(\d)\/(\d+)\.png/;
  my $file;
  if ($1 eq "training" ){
      $file = $train;
  }
  else{
      $file = $test;
  }
  printf $file "%s\t%s\t./%s/%s/%s.png\n", $3 , $2, $1 , $2, $3;
}

close $train;
close $test;

コントロールファイルの内容はこんな感じです。

index    label    pngファイルのパス

コントロールファイルから今度はmxnetのファイル形式のrecord形式に変えてあげます
im2recというコマンドがmxnetには用意されています。color=0とする所が肝です
グレースケールのrecordファイルになります。

im2rec testing.crl ./ testing.rec encoding=.png color=0

詳細は、以下を参照してください。
github.com

テストが通らない!!

しかし、テストが通らない。仕方ない甘えではありますが、Issueを発行して
聞いてみようということで聞いてみました。

github.com

AI::MXNetモジュールの作者さんから回答があっという間にいただけました。
感謝の極みです。データをシャッフルしないとだめとか、色々と添削をいただきました。
これでテストが通りました!!!

やっと、次の段階に進むことができます。