一日坊主

雰囲気でやっている

Chainer x Azure ML Hackathon CV編に参加してきた

はじめに

dllab.connpass.com

に参加した。振り返りが推奨されるとのことだったので、自分のやったことをまとめておく。

参加目的

  1. Chainerの使い方を学ぶ(Chainer使ったことなし)
  2. DNNのモデルを転移学習1するときの勘所を学ぶ※未達

振り返り

  1. Chainerの使い方はChainer v4 ビギナー向けチュートリアルにほとんどすべて書いてあった
  2. ChainerCVというComputer Vision向けのライブラリを使うと、訓練済みの画像認識モデルがすぐ使える

以下、やったことメモ(雑文)

1. Azure Machine Learningチュートリアル by Microsoft畠山さま(@dahatake資料

  • VoTTというアノテーションツールを使うと画像とVideoのタグ付けが楽ちんになるらしい(未使用)
  • Azure Machine Learning Workbenchは複数人でMLプロジェクトやるときに便利(バージョン管理とか)
  • NC6インスタンスを使う際のおすすめリージョンは「米国西部2」(GPUインスタンスがたくさんある)

2. Chainerチュートリアル by PFN齋藤さま(@mitmul資料

  • Chainerはdefine-by-run2のNNフレームワークのパイオニア(最近はPyTorchやTensorFlow Eager Executionでもできる)
  • Chainerの強みは、分散深層学習やCuPy連携による高速学習
  • 最近のアップデートはSequentialクラス。(Kerasと同じように書ける)
  • DNNモデル作るとき、Optimizerは重要。基本的にはAdamで良い(精度を求めるときはMomentum SGDを使って学習率を変えて、とかやんないといけない)
  • Chainerではパラメトリックな関数をLink (chainer.links)、ノンパラメトリックな関数をFunction (chainer.functions)として区別している
  • Function(chainer.functions.max_pooling_2dとか)に対してパラメータを部分適用するときは、Pythonのpartialを使う3
  • 独自Datasetを定義するときはchainer.dataset.DatasetMixinを継承する(呼び出し時にメモリロードするようになる)

3. ハッカソン

  • Azure、Chainerを使って自由にどうぞという感じ
  • Azureのインスタンス立ち上げとか、Azure Data Science Virtual Machine (Ubuntu)にデフォルトで入ってるChainerのバージョンアップとか、前段の部分で苦戦している人が多かった
  • サンプルデータとしてKaggleのCats and Dogsanimeface-character-datasetCelebA Datasetなどが紹介された
  • とりあえず自分はChainerのYOLOv3を使ってCats and Dogsの物体検出と分類をやってみた(ひねりがない)
  • chainercv/examples/yolo at master · chainer/chainercv · GitHubこのサンプルを動かしただけ(2,3枚確認した限り、きれいに犬猫の検出と分類ができていた)
  • ほんとはここ(Tips using Links — ChainerCV 0.10.0 documentation)を参考にしながらCats and Dogsのデータでfine-tuningまでやりたかったけど、時間切れでできなかった
  • yolo_v3.pyの153行目あたりでchainer.ChainList()を定義しているから、このあたりのネットワークの中間出力をうまいこと使うとfine-tuningできるらしい
  • ChainerのTrainerを使うとモデルの訓練やデバッグがやりやすそう(デバッグはTensorFlow一強かと思っていたので、この辺は収穫だった)
  • ChainerUIを使うと、TensorBoardのようにLearning Curveをブラウザ上にリアルタイム描画できる

おわりに

  • Microsoft畠山さま、廣野さま、NC6インスタンスをタダで使わせてくれたり、会場や飲み物やピザの提供、ありがとうございました。あとTシャツありがとうございました。
  • PFN齋藤さま、Chainerの分かりやすいチュートリアルや、アドバイス等、ありがとうございました。

  1. 転移学習:機械学習の次のフロンティアへの招待

  2. Define-by-Run — Chainer 4.1.0 documentation

  3. lambdaを使っても同様のことはできる。ただ、lambdaを複数箇所で使うと、関数名が衝突してpickle(シリアライズ)するときに不都合があるらしい。