EnsekiTT Blog

EnsekiTTが書くブログです。

機械学習とかDeepLearningのデータのアルゴリズムとロジスティクスの話。

つまりなにしたの?

友達と話したアルゴリズムとデータ自体のロジスティクスの話をまとめておこうと思って書いた。

f:id:ensekitt:20170928222038j:plain
*1

飲み屋での話の流れ*2

最近多少マシになったけど、一時期のアルゴリズム深すぎて自宅で回すのきつくね?
わかる。

みたいな話をしてた時に、

つか、アルゴリズムは新しく考えるんじゃなければ実装すりゃいいけど、アルゴリズムにデータ流すところで苦労してるよな俺ら

って言葉が出て、そこからデータをためたり流したりビジネスで活用するところの話になった。

アルゴリズムとデータ構造っていうよりちょっと広いよね。全く別ではないけど
データのアルゴリズムロジスティクスってことじゃね!?

とお互い納得してた。

アルゴリズムロジスティクス

DeepLearningで言えばネットワークの構造や最適化の部分(GoogLeNet ResNetとかとか

データの入出力やデータ構造、保持の仕方、ビジネスロジックへのエクスポート(今更だけどだいぶ広い
と分けてみた。
Wikipediaで調べてみると

ロジスティクスとは、サプライチェーンプロセスの一部であり、顧客の要求を満たすため、発生地点から消費地点までの効率的・発展的な「もの」の流れと保管、サービス、および関連する情報を計画、実施、およびコントロールする過程である。

ロジスティクス - Wikipedia
って引用が出てきた。
「もの」ではないけど「データ」に置き換えるとしっくりくる。

実はロジスティクスで苦労してる

みんな大好きMNISTチュートリアルはどのフレームワークでもアルゴリズム以外の部分を徹底的に隠蔽されている。下手すりゃアルゴリズムだって意識させない場合すらある。
機械学習系の仕事をしてる友人は、アルゴリズムももちろん触っているけど、データの入出力をうまいことやれたから商売になっている。
っていってて、極論、アルゴリズムを価値に変えているのはロジスティクスの部分。

活用したい人たちはアルゴリズムを作りたいわけじゃないから、ざっくりいうと

凄いらしいアルゴリズムに、うちのビジネスや活動から生まれるデータを繋いで有益な情報を得たい!!

って思ってる。
僕はアホなのでついついアルゴリズムを追って世界はすごいなぁと口を開けてることが多いけど、
一部の人以外にとってはいくら優秀なアルゴリズムもサービスインできなければ価値は産まない。

TensorFlowのResNetサンプルのロジスティクスを読み解く

github.com

ResNetの学習を実行する時
python cifar10_download_and_extract.py
python cifar10_main.py
こんな感じで動かしている。

環境さえ整っていれば2行で動くんだからすごい。
すごすぎてなにやってるんだかまるでわからん。
ensekitt.hatenablog.com
動かした時の記事はこちら。

1行目でやっていること

データセット(CIFAR-10)のダウンロード

具体的には?

  if not os.path.exists(FLAGS.data_dir):
    os.makedirs(FLAGS.data_dir)
  • ダウンロードするべきファイルが無いか確認してダウンロード
  if not os.path.exists(filepath):
    def _progress(count, block_size, total_size):
      sys.stdout.write('\r>> Downloading %s %.1f%%' % (filename,
          100.0 * count * block_size / total_size))
      sys.stdout.flush()

    filepath, _ = urllib.request.urlretrieve(DATA_URL, filepath, _progress)
    print()
    statinfo = os.stat(filepath)
    print('Successfully downloaded', filename, statinfo.st_size, 'bytes.')

Urllib.request.urlretrieve(ダウンロードしたいURL, 入れたいパス, コールバック関数)
コールバック関数ではダウンロードステータスを表示するコードが動いている。

  • ダウンロードしてきたtarを解体する
 tarfile.open(filepath, 'r:gz').extractall(FLAGS.data_dir)

対象ディレクトリにtarを解体する

どんなもんが出来ているのか確認する。

Cifar-10-batches-binというディレクトリができてる。
data_batch_[n].bin
test_batch.bin
があってそれぞれ1万枚ずつ画像が入っている。
バイナリ版の形式としては<粗いラベル1つ><細かいラベル1つ><3072 x ピクセルデータ>
って感じで入っている。
これでデータが調達できました。
これでも狂ったようにラベル付けたりしてないだけだいぶマシ。
Cifar-10についてとても詳しくまとまってて参考にさせていただいた。
aidiary.hatenablog.com

2行めについては後日やる

*1:Photo by unsplash.com

*2:酔ってた

*3:※一般的な名前ではない。その時はロジスティクスでしっくり来た。なんかいい言葉・既存の言い方があったら全然乗り換える所存。