Upload
-
View
658
Download
2
Embed Size (px)
Citation preview
2017/11/30株式会社ネクストスケープ
上坂貴志Microsoft MVP for Mircosoft Azure
Cogbot勉強会 # 9
Cognitive Toolkit ハンズオン
自己紹介
好きな技術ドメイン駆動設計!アジャイル!深層学習!
株式会社ネクストスケープクラウド事業本部 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 登壇◆他多数
うえさか たかし
AzureMLの入門記事
「ゼロからはじめるAzure」シリーズにて、全4回でAzureML入門記事を執筆中です。現在第1回が公開されております。
是非ご覧ください~
https://news.mynavi.jp/article/zeroazure-10/
Azureもくもく新宿
Conpassで「Azureもくもく会@新宿」と検索してください!
AIをもくもくする日です。• AzureML• Cognitive Services• 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をクリックすると、自分の環境へコピーされます。
環境作成
• DataScienceVMを使用する場合1. 次のいずれかのリンクをブラウザで開きます。
• https://notebooks.azure.com/nsuesaka/libraries/cogbot-no9
• https://goo.gl/TDTPtB
2. ファイルをクリック→右クリック→ダウンロードでファイルを1つずつ全てダウンロードします。
1.CNTK MNIST by DNN
1.CNTK MNIST by DNN
• MNISTを全結合のニューラルネットワークで分類します。
• CNTK独自の実装を極力行わず、他のFrameworkに慣れた人にとって親和性が高い実装方法です。(Trainerを使用していない)
1.CNTK MNIST by DNN
Scikit-learnのライブラリを使用して、MNISTをDownload
0~255の数値を0~1に正規化
トレーニングとTestにデータを分割
ラベルの数値0~9をint型に変換
1.CNTK MNIST by DNN
乱数のシード値を固定して、毎回同じ乱数を発生させる
発生した乱数値に合わせてトレーニングとラベルを並べ替え
1.CNTK MNIST by DNN
ラベル値0~9をone-hot表現に変換例:3は0001000000になる
Denseは全結合のニューラルネットワーク層のこと。最後の層のニューロンが10個なのは、ラベルが0~9で10個だから
Cognitive Toolkitでは、モデル定義はこのSequentialを使用して層を上から順に書いていく
最後の層はActivationをNoneにすることに注意。Softmaxはここで指定しない
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を指定した
1.CNTK MNIST by DNN
すいません、epoch_sizeの方が適切な変数名でした。1epoch内に含まれるトレーニングデータの数です
学習率をここで決めています
ミニバッチのサイズです。32にしています
オプティマイザです。SGDやadagladなどがありますが、個人的に最初はAdamから試行するのでAdamにしてあります
1.CNTK MNIST by DNNログ出力オブジェクトです。300にすると、ミニバッチ数32*300= 9600データ学習した時点でログを出力します
トレーニング実施です
学習済みモデルに対して、テストを実施してどれぐらい一般化できているかを確認します
2.CNTK MNIST by DNN with Trainer
2.CNTK MNIST by DNN with Trainer
•「1.CNTK MNIST by DNN」を、Trainerというオブジェクトを使用してトレーニングする方法に実装を変更しています。
• Trainerを使用すると、Early Stoppingや、学習率の動的な更新など細かい対応が可能です。(このハンズオンではそこまで実装していません)
•「1.CNTK MNIST by DNN」との違いだけを解説します。
2.CNTK MNIST by DNN with Trainer
@cntk.Functionデコレータを使ったPython関数がなくなった。トレーニングはTrainerでこの後に実装するため。ここではTrainerに渡すためにモデルz、損失関数loss、評価エラーmetricを個別に宣言している
2.CNTK MNIST by DNN with Trainer
入出力のVariableであるx, yに対応したディクショナリでトレーニングとラベルデータを宣言し、それを渡して学習を実行
Trainerオブジェクトの生成
1epoch終わるたびにデータをシャッフル
ミニバッチサイズにデータを切り出し
すいません、これ要らないです
2.CNTK MNIST by DNN with Trainer
学習済みのモデルはtrainerが持っている。test_minibatchメソッドにテスト用データを渡して一般化を評価している
3.CNTK MNIST by CNN
3.CNTK MNIST by CNN
•いよいよ深層学習です。CNNを実装します。
•「2. CNTK MNIST by DNN with Trainer 」を、CNNを使用するように変更します。
•「 2. CNTK MNIST by DNN with Trainer 」との違いだけを解説します。
3.CNTK MNIST by CNN
CNN対応の一番のポイントはここ。Trainerはミニバッチでデータを受け取るので、4次元の行列を入力にしなければならない。
CNTKでは、画像の形式を(チャンネル数, Height , Width)として扱う。
3.CNTK MNIST by CNN
このdefault_optionsでは、Sequential内の各Layerのデフォルトパラメータを設定しておく
Filterのサイズが5x5でフィルター数が32です。Activationの記載がないのでデフォルトのreluになる。Padも記載がないため、デフォルトのTrueとなる
4.Change MNIST to Image Reader Format
4.Change MNIST to Image Reader Format
•これまではMNISTを全量メモリに読み込んでいました。
•でも、現実のデータ量はもっと大きく、大量なのでメモリに全量読み込むことはできません。
• CNTKはこのシナリオに対応したReaderクラスを用意しています。
1. CTFReader(Textファイル用)2. CTBReader(バイナリファイル用)3. ImageReader(画像ファイル用)
•ここではImageReader用にMNISTを加工してファイルに出力し、次の5でImgareReaderを使用するCNNを実装します。
•解説はJupyter Notebookに記載してあります。
5.CNTK MNIST by CNN with Image Reader
5.CNTK MNIST by CNN with Image Reader
• ImageReaderは、他の深層学習用Frameworkのデータリーダーと同様に入力画像を少しだけ加工してデータを水増しする機能があります。
•この実装例ではMNIST画像をランダム縮小する加工を行っています。
•そのため、入力数に上限はありません。ImageReaderを呼べばそのたびに加工された画像を取得可能です。(やりすぎると過学習します)
•インプットのバリエーションが増えるため、CNNモデルの層が貧弱だとMNISTにも関わらず認識率が良くありません。(この例では良くない)
5.CNTK MNIST by CNN with Image Reader
ランダムに縮小しつつ、jitterによって画像に乱れ(ぼかした感じ)を追加する設定
train_map.txtを読み込んで、対象となる画像とラベルを読むDeserializerを作成トレーニング画像用のリーダーを作成
5.CNTK MNIST by CNN with Image Reader
テスト画像用のリーダーを作成
test_map.txtを読み込んで、対象となる画像とラベルを読むDeserializerを作成
5.CNTK MNIST by CNN with Image Reader
入力値0~255を0~1に正規化
5.CNTK MNIST by CNN with Image Reader
ImageReaderで指定した入力と、モデルに設定した入出力のVariableをマッピング
リーダーからミニバッチサイズのデータを受け取る
リーダーを引数に、トレーニング実行
5.CNTK MNIST by CNN with Image Reader
テストデータ用のリーダーからデータを受け取る
評価の実行結果はミニバッチ単位の平均評価エラー。それにミニバッチ数を掛けて、エラー数を求める。それを累計する
総平均エラー率を算出
これ、何をしているかわかりますか?端数計算です