33
2017/11/30 株式会社ネクストスケープ 上坂 貴志 Microsoft MVP for Mircosoft Azure Cogbot 勉強会 # 9 Cognitive Toolkit ハンズオン

Cogbot no9 CNTKハンズオン資料

  • Upload
    -

  • View
    658

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Cogbot no9 CNTKハンズオン資料

2017/11/30株式会社ネクストスケープ

上坂貴志Microsoft MVP for Mircosoft Azure

Cogbot勉強会 # 9

Cognitive Toolkit ハンズオン

Page 2: Cogbot no9 CNTKハンズオン資料

自己紹介

好きな技術ドメイン駆動設計!アジャイル!深層学習!

株式会社ネクストスケープクラウド事業本部 C&T部 部長

エバンジェリスト / ITアーキテクト / CSA上坂 貴志

Microsoft MVP for Microsoft Azure

Scrum(認定スクラムマスター)

2017年 ◆ Cogbotコミュニティ登壇

2016年 ◆ Schooドメイン駆動設計入門出演◆ UMTP モデリングフォーラム2016 登壇◆QCon Tokyo 2016 DDD実践報告◆de:code 2016 登壇◆NS Study No.6 Azure IoTHub紹介登壇◆アプレッソ Azure MLセミナー登壇◆SANSAN DDD勉強会発表

2015年 ◆FEST2015 (Channel9で動画公開)◆Developers Summit 2015◆QCon Tokyo 2015◆de:code 2015 登壇◆他多数

うえさか たかし

Page 3: Cogbot no9 CNTKハンズオン資料

AzureMLの入門記事

「ゼロからはじめるAzure」シリーズにて、全4回でAzureML入門記事を執筆中です。現在第1回が公開されております。

是非ご覧ください~

https://news.mynavi.jp/article/zeroazure-10/

Page 4: Cogbot no9 CNTKハンズオン資料

Azureもくもく新宿

Conpassで「Azureもくもく会@新宿」と検索してください!

AIをもくもくする日です。• AzureML• Cognitive Services• CNTKなどなど

Page 5: Cogbot no9 CNTKハンズオン資料

環境作成

Page 6: Cogbot no9 CNTKハンズオン資料

環境作成

• Azure Notebooksを使用する場合1. Azure Notebooksにアクセスしてログインしておきます。

• https://notebooks.azure.com

2. 次のいずれかのリンクをブラウザで開きます。• https://notebooks.azure.com/nsuesaka/libraries/cogbot-no9

• https://goo.gl/TDTPtB

3. Cloneをクリックすると、自分の環境へコピーされます。

Page 7: Cogbot no9 CNTKハンズオン資料

環境作成

• DataScienceVMを使用する場合1. 次のいずれかのリンクをブラウザで開きます。

• https://notebooks.azure.com/nsuesaka/libraries/cogbot-no9

• https://goo.gl/TDTPtB

2. ファイルをクリック→右クリック→ダウンロードでファイルを1つずつ全てダウンロードします。

Page 8: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNN

Page 9: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNN

• MNISTを全結合のニューラルネットワークで分類します。

• CNTK独自の実装を極力行わず、他のFrameworkに慣れた人にとって親和性が高い実装方法です。(Trainerを使用していない)

Page 10: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNN

Scikit-learnのライブラリを使用して、MNISTをDownload

0~255の数値を0~1に正規化

トレーニングとTestにデータを分割

ラベルの数値0~9をint型に変換

Page 11: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNN

乱数のシード値を固定して、毎回同じ乱数を発生させる

発生した乱数値に合わせてトレーニングとラベルを並べ替え

Page 12: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNN

ラベル値0~9をone-hot表現に変換例:3は0001000000になる

Denseは全結合のニューラルネットワーク層のこと。最後の層のニューロンが10個なのは、ラベルが0~9で10個だから

Cognitive Toolkitでは、モデル定義はこのSequentialを使用して層を上から順に書いていく

最後の層はActivationをNoneにすることに注意。Softmaxはここで指定しない

Page 13: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNN

直前で定義したモデル(model_mn)に対して、損失関数交差エントロピーと、クラス分類エラーを設定するpython関数

@cntk.Functionデコレータによって、python関数がcntkのFunctionオブジェクトに変換される。ここで作ったFunctionオブジェクトが学習モデルである。(trainメソッドを持つ)

@cntk.Functionデコレータによって、python関数がcntkのFunctionオブジェクトに変換される。直上で宣言したVariableオブジェクトを引数にとっていることに注目

学習モデルの入出力を表すVariableオブジェクトを宣言

Softmaxの結果に対する交差エントロピー。だからモデル作成の最後の層のactivationはNoneを指定した

Page 14: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNN

すいません、epoch_sizeの方が適切な変数名でした。1epoch内に含まれるトレーニングデータの数です

学習率をここで決めています

ミニバッチのサイズです。32にしています

オプティマイザです。SGDやadagladなどがありますが、個人的に最初はAdamから試行するのでAdamにしてあります

Page 15: Cogbot no9 CNTKハンズオン資料

1.CNTK MNIST by DNNログ出力オブジェクトです。300にすると、ミニバッチ数32*300= 9600データ学習した時点でログを出力します

トレーニング実施です

学習済みモデルに対して、テストを実施してどれぐらい一般化できているかを確認します

Page 16: Cogbot no9 CNTKハンズオン資料

2.CNTK MNIST by DNN with Trainer

Page 17: Cogbot no9 CNTKハンズオン資料

2.CNTK MNIST by DNN with Trainer

•「1.CNTK MNIST by DNN」を、Trainerというオブジェクトを使用してトレーニングする方法に実装を変更しています。

• Trainerを使用すると、Early Stoppingや、学習率の動的な更新など細かい対応が可能です。(このハンズオンではそこまで実装していません)

•「1.CNTK MNIST by DNN」との違いだけを解説します。

Page 18: Cogbot no9 CNTKハンズオン資料

2.CNTK MNIST by DNN with Trainer

@cntk.Functionデコレータを使ったPython関数がなくなった。トレーニングはTrainerでこの後に実装するため。ここではTrainerに渡すためにモデルz、損失関数loss、評価エラーmetricを個別に宣言している

Page 19: Cogbot no9 CNTKハンズオン資料

2.CNTK MNIST by DNN with Trainer

入出力のVariableであるx, yに対応したディクショナリでトレーニングとラベルデータを宣言し、それを渡して学習を実行

Trainerオブジェクトの生成

1epoch終わるたびにデータをシャッフル

ミニバッチサイズにデータを切り出し

すいません、これ要らないです

Page 20: Cogbot no9 CNTKハンズオン資料

2.CNTK MNIST by DNN with Trainer

学習済みのモデルはtrainerが持っている。test_minibatchメソッドにテスト用データを渡して一般化を評価している

Page 21: Cogbot no9 CNTKハンズオン資料

3.CNTK MNIST by CNN

Page 22: Cogbot no9 CNTKハンズオン資料

3.CNTK MNIST by CNN

•いよいよ深層学習です。CNNを実装します。

•「2. CNTK MNIST by DNN with Trainer 」を、CNNを使用するように変更します。

•「 2. CNTK MNIST by DNN with Trainer 」との違いだけを解説します。

Page 23: Cogbot no9 CNTKハンズオン資料

3.CNTK MNIST by CNN

CNN対応の一番のポイントはここ。Trainerはミニバッチでデータを受け取るので、4次元の行列を入力にしなければならない。

CNTKでは、画像の形式を(チャンネル数, Height , Width)として扱う。

Page 24: Cogbot no9 CNTKハンズオン資料

3.CNTK MNIST by CNN

このdefault_optionsでは、Sequential内の各Layerのデフォルトパラメータを設定しておく

Filterのサイズが5x5でフィルター数が32です。Activationの記載がないのでデフォルトのreluになる。Padも記載がないため、デフォルトのTrueとなる

Page 25: Cogbot no9 CNTKハンズオン資料

4.Change MNIST to Image Reader Format

Page 26: Cogbot no9 CNTKハンズオン資料

4.Change MNIST to Image Reader Format

•これまではMNISTを全量メモリに読み込んでいました。

•でも、現実のデータ量はもっと大きく、大量なのでメモリに全量読み込むことはできません。

• CNTKはこのシナリオに対応したReaderクラスを用意しています。

1. CTFReader(Textファイル用)2. CTBReader(バイナリファイル用)3. ImageReader(画像ファイル用)

•ここではImageReader用にMNISTを加工してファイルに出力し、次の5でImgareReaderを使用するCNNを実装します。

•解説はJupyter Notebookに記載してあります。

Page 27: Cogbot no9 CNTKハンズオン資料

5.CNTK MNIST by CNN with Image Reader

Page 28: Cogbot no9 CNTKハンズオン資料

5.CNTK MNIST by CNN with Image Reader

• ImageReaderは、他の深層学習用Frameworkのデータリーダーと同様に入力画像を少しだけ加工してデータを水増しする機能があります。

•この実装例ではMNIST画像をランダム縮小する加工を行っています。

•そのため、入力数に上限はありません。ImageReaderを呼べばそのたびに加工された画像を取得可能です。(やりすぎると過学習します)

•インプットのバリエーションが増えるため、CNNモデルの層が貧弱だとMNISTにも関わらず認識率が良くありません。(この例では良くない)

Page 29: Cogbot no9 CNTKハンズオン資料

5.CNTK MNIST by CNN with Image Reader

ランダムに縮小しつつ、jitterによって画像に乱れ(ぼかした感じ)を追加する設定

train_map.txtを読み込んで、対象となる画像とラベルを読むDeserializerを作成トレーニング画像用のリーダーを作成

Page 30: Cogbot no9 CNTKハンズオン資料

5.CNTK MNIST by CNN with Image Reader

テスト画像用のリーダーを作成

test_map.txtを読み込んで、対象となる画像とラベルを読むDeserializerを作成

Page 31: Cogbot no9 CNTKハンズオン資料

5.CNTK MNIST by CNN with Image Reader

入力値0~255を0~1に正規化

Page 32: Cogbot no9 CNTKハンズオン資料

5.CNTK MNIST by CNN with Image Reader

ImageReaderで指定した入力と、モデルに設定した入出力のVariableをマッピング

リーダーからミニバッチサイズのデータを受け取る

リーダーを引数に、トレーニング実行

Page 33: Cogbot no9 CNTKハンズオン資料

5.CNTK MNIST by CNN with Image Reader

テストデータ用のリーダーからデータを受け取る

評価の実行結果はミニバッチ単位の平均評価エラー。それにミニバッチ数を掛けて、エラー数を求める。それを累計する

総平均エラー率を算出

これ、何をしているかわかりますか?端数計算です