Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Watson】Watson Studio でMNIST手書き文字認識を行う②【モデル学習・推論】

前回までのあらすじ

rennnosukesann.hatenablog.com

前回の記事では、Watson Studioのセットアップを行いました。 今回の記事では、実際にMNISTデータセットを使って手書き文字の学習とクラス分類を行います。

MNISTとは

MNISTとは、パターン認識機械学習の研究で頻繁に用いられる手書き文字画像データです。

f:id:rennnosukesann:20180620081207p:plain

手書き文字といってもアルファベットやひらがながすべて網羅されている・・・というわけではなく、0から9までの10種類の手書き文字のみから構成されています。データセットとしてシンプルでありながら十分な数のデータ数があるため、少し前はアルゴリズム・手法の性能を図るためのスタンダードなデータセットとして、現在は機械学習のHello,World的データセットとして用いられています。

それでは、早速Watson StudioでMNISTを学習してみましょう!

Usage

データセットを取得する

まずはデータがなければ始まらないので、MNIST手書き文字データセットをダウンロードします。

今回はWatson Studioに読み込ませるMNISTがほしいので、こちらからダウンロードします。

遷移先のページ右上にダウンロードボタンがあるので、クリックしてMNISTのpklファイルをダウンロードしましょう。

f:id:rennnosukesann:20180620082507p:plain

MNIST-pkl.zipがダウンロードできるので、解凍して

  • mnist-keras-test.pkl
  • mnist-keras-train.pkl
  • mnist-keras-valid.pkl
  • mnist-keras-test-payload.json

があることを確認します。

Watson Studioプロジェクトを作成する

前回の記事で作成したWatson Studioサービスのページに遷移し、「Get Started」をクリックします。

f:id:rennnosukesann:20180630002352p:plain

するとWatson Studioのトップページに遷移するので「Get started with key tasks」メニューの「New project」ボタンをクリックしてください。

f:id:rennnosukesann:20180630002551p:plain

するとプロジェクトの種類を選択するダイアログが出現します。
今回は深層学習を行うので、「Deep Learning」を洗濯して「OK」を押してください。

f:id:rennnosukesann:20180630002751p:plain

画面遷移時にMachine Learning・Object Storageサービスの作成が行われます(未作成の場合)。インストールしたいスペースを聞かれるので、Watson Studioと同じスペースを選択してください。

次にプロジェクト詳細を定義します。
先程作成したMachine Learning・Object Storageサービスが右側に表示されているか確認してください。設定されていなければ「Reload」ボタンを押してみてください。

問題がなければ「create」を押します。

f:id:rennnosukesann:20180630003359p:plain

データセットをWatson Studioに読み込ませる

ストレージが用意できたので、ダウンロードしたデータセットをWatson Studioにアップロードします。

Watson Studio画面トップのメニューバーのプルダウン「Service」をクリックし、次いで「Data Services」をクリックします。

f:id:rennnosukesann:20180630003839p:plain

「Cloud Object Storage」メニュー中にある、先ほど作成したObject Storageサービスをクリック。

f:id:rennnosukesann:20180630004026p:plain

バケットの作成」をクリック。

f:id:rennnosukesann:20180630004130p:plain

バケット作成ダイアログが出現するので、名前を入力してください。
念の為、ロケーションをus-geoにします。その後「作成」をクリック。

f:id:rennnosukesann:20180630004334p:plain

するとデータをアップロードする画面が表示されます。
右上の「アップロード」ボタンをクリックしてファイルダイアログを開き、ダウンロードしたpklファイルをすべてアップロードしてください。ドラッグ&ドロップでもアップロード可能です。

f:id:rennnosukesann:20180630004728p:plain

f:id:rennnosukesann:20180630004840p:plain

f:id:rennnosukesann:20180630005033p:plain

f:id:rennnosukesann:20180630004859p:plain

このような感じでアップロードできたらOK。

f:id:rennnosukesann:20180630005122p:plain

その後、同じように学習結果出力用のバケットも作成します。
先ほどとは別名のバケットをもう一つ作成してください。
データセットのアップロードは不要です。

f:id:rennnosukesann:20180630012301p:plain

モデルの作成

次に学習・クラス分類のためのモデルを作成します。

Watson Studioトップページに戻り、「Get started with key tasks」メニューの「New Modeler Flow」をクリック。

f:id:rennnosukesann:20180630005416p:plain

遷移先の画面の「From example」タブをクリック。
今回はすでに用意されているDeep Learningのモデルを使います。

f:id:rennnosukesann:20180630005611p:plain

遷移したら、「Single Convolution layer on MNIST」のカードメニューをクリックし、「Project」が冒頭で作成したプロジェクト担っていることを確認して「Create」をくりっくしてください。

f:id:rennnosukesann:20180630005824p:plain

すると何やら数珠つなぎになった図が表示されます。
これはDeep Learningで用いられる「ニューラルネットワーク」と呼ばれる学習モデル(と最適化アルゴリズム等のオプション)の構成を表しており、これらの構成自体や、各パーツのパラメータを調整することでモデルの推論精度を高めたりすることができます。

一旦モデルの構造には変更を加えず、モデルの学習・テストに使うデータを設定します。

「Image Data」をダブルクリックすると下記サイドメニューが表示されるので、「Create a Connection」をクリックしてください。 Object Storageに接続します。

f:id:rennnosukesann:20180630010244p:plain

接続がうまく行った場合、「Data Connection」プルダウンが表示されるので、「Connect to project COS」を選択してください。すると続けて「Buckets」プルダウンが表示されるので、先程アップロードしたデータを含むバケットの名称を選択します。
その後「Train data file」「Test data file」「Validation data file」の所在を聞かれるのでそれぞれアップロード舌ファイルを選択し、「Close」をクリック。

f:id:rennnosukesann:20180630010835p:plain

最後にモデルを公開します。
画面右上のアップロードボタンをクリック。

f:id:rennnosukesann:20180630010954p:plain

ダイアログが出てくるので、名前が先ほど作成したモデル名であり、WML Instance の名前が冒頭で作成したサービスのものと一致するかチェックして「Publish」をクリック。

f:id:rennnosukesann:20180630011150p:plain

緑色の通知が出てきたら成功です!
さらにモデルの学習をすべく「or Train it in an experiment」をクリックしましょう。

f:id:rennnosukesann:20180630011339p:plain

モデルを学習する

先程のリンクをクリックすると、Experiment作成画面に遷移します。
Experimentはモデルの学習やテスト、精度推移の可視化などができる実験環境の単位を指します。

名前を入力し、作成したMachine Learning Serviceを選択してください。

f:id:rennnosukesann:20180630012858p:plain

その後下段の「Cloud Object Storage bucket for...」の「Select」ボタンをクリック。

f:id:rennnosukesann:20180630011832p:plain

「Cloud Object Storage connection」から「Connection to project COS」を選択し、 「Bucket containing training data」にはデータセットをアップロードしたバケットを、「Bucket for storing training results」には学習結果出力用のバケットを指定します。 指定したら「Select」をクリック。

f:id:rennnosukesann:20180630011955p:plain

新規experiment作成画面に戻り、「Add training definition」をクリックします。

f:id:rennnosukesann:20180630012910p:plain

先程作成したモデルを指定するため、「Existing training definition」タブ → 作成したモデル名を選択します。

f:id:rennnosukesann:20180630013223p:plain

すると「Training definition attributes」メニューが表示されます。 「Compute plan」はモデルの学習・テストに使う計算機リソースの構成のうち、どのGPUをどれだけ利用するかを選択します(台数や一台の性能が良いほどメモリや並列性が増し、学習やテストが高速になる)。「Hyperparameter optimization method」はモデルを学習する上でハイパパラメタ、つまり学習の際に予め設定しておくパラメータ初期値をどのように決定するかを指定します。今回は前者を「1 x NVIDIA® Tesla® K80 (2 GPU)」とし、校舎を「None」としました。選択したら「Select」をクリック。

f:id:rennnosukesann:20180630013722p:plain

「Create and Run」を押しましょう。

f:id:rennnosukesann:20180630013921p:plain


学習が開始されました!

遷移先の画面ではモデルの学習中の様子を見ることができます。 学習中のモデルの状態は「Queued」「In progress」「Completed」の順に遷移していき、「Completed」になると学習が終了したことを表します。

f:id:rennnosukesann:20180630014148p:plain

終了したら、詳細を見てみましょう。

f:id:rennnosukesann:20180630014516p:plain

学習が完了していることがわかります。

f:id:rennnosukesann:20180630014543p:plain

Logsには学習時のコンソールログも残されており、学習回数や、学習時点での学習データに対する分類精度等を見ることができます。

f:id:rennnosukesann:20180630014722p:plain

学習したモデルを保存する

学習したモデルは、保存して利用できるようになります。

先程の「Completed」状態にあるモデルの右端のメニュープルダウンから「Save model」を選択します。

f:id:rennnosukesann:20180630015326p:plain

保存用ページに遷移するので、名前を入力し、「Save」ボタンを押しましょう。

f:id:rennnosukesann:20180630015624p:plain

成功すると、緑色の通知が出ます。

f:id:rennnosukesann:20180630015712p:plain

「here」をクリックすることで、保存したモデルの詳細を見ることができます。 (またはメニューバー「Project」から作成したプロジェクトの「Assets」タブに遷移し、「Experiments」の項目で「Add Experiment」をクリックします)

保存したモデルをデプロイする

次に、保存したモデルをデプロイします。
デプロイすると、テストデータを使った検証や、API経由で分類器を提供することが可能になります。

今回はWeb Service としてデプロイしてみましょう。

先程のモデル詳細画面の「Deployments」タブをクリックします。

f:id:rennnosukesann:20180630020023p:plain

「Add Deployment」をクリック。

f:id:rennnosukesann:20180630020050p:plain

遷移先の画面

f:id:rennnosukesann:20180630020144p:plain

今回はテストデータセットを使った性能評価を行うので「Deployment type」の「Web Service」を選択します。 あとは名前を入力して「Save」をクリックします。

これだけでデプロイ完了です! 早速テストしてみましょう!

デプロイしたモデルをテストする

デプロイした結果作成されたDeployをクリックし、「Test」タブをクリックします。

f:id:rennnosukesann:20180630021900p:plain

f:id:rennnosukesann:20180630164518p:plain

冒頭でダウンロードしたmnist-keras-test-payload.jsonの拡張子を.htmlに変更します。 変更したあと、ブラウザでHTMLファイルを開きます。

f:id:rennnosukesann:20180630164744p:plain

開いたページのJSONファイルをコピーし、先程のDeploy画面のTestタブ内にあるフォームにペーストしてください。

f:id:rennnosukesann:20180630164850p:plain

「Predict」をクリックすると、クラス分類が開始されます。
元のJSONデータは数字の「7」を記した画像の濃淡値データを表しているので、帰ってきたクラス分類結果が「7」であれば分類成功です。

f:id:rennnosukesann:20180630165045p:plain

結果が帰ってきました!
レスポンスJSONvalues内配列の8番目の数値が1の場合、これは数字の7であるという分類結果になります。 上記画像では分類に成功していることがわかります。

まとめ

いかがだったでしょうか。

今回はMNIST分類の簡単な学習とテストを行いましたが、より複雑なモデルの構築、学習、テストももちろん可能です。
pythonスクリプトへのエクスポートなどもできるので、これからどんどん試していこうと思います。

参考

www.ibm.com

Neural network modeler - IBM Watson

qiita.com