前回までのあらすじ
前回の記事では、Watson Studioのセットアップを行いました。 今回の記事では、実際にMNISTデータセットを使って手書き文字の学習とクラス分類を行います。
MNISTとは
MNISTとは、パターン認識や機械学習の研究で頻繁に用いられる手書き文字画像データです。
手書き文字といってもアルファベットやひらがながすべて網羅されている・・・というわけではなく、0から9までの10種類の手書き文字のみから構成されています。データセットとしてシンプルでありながら十分な数のデータ数があるため、少し前はアルゴリズム・手法の性能を図るためのスタンダードなデータセットとして、現在は機械学習のHello,World的データセットとして用いられています。
それでは、早速Watson StudioでMNISTを学習してみましょう!
Usage
データセットを取得する
まずはデータがなければ始まらないので、MNIST手書き文字データセットをダウンロードします。
今回はWatson Studioに読み込ませるMNISTがほしいので、こちらからダウンロードします。
遷移先のページ右上にダウンロードボタンがあるので、クリックしてMNISTのpklファイルをダウンロードしましょう。
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」をクリックします。
するとWatson Studioのトップページに遷移するので「Get started with key tasks」メニューの「New project」ボタンをクリックしてください。
するとプロジェクトの種類を選択するダイアログが出現します。
今回は深層学習を行うので、「Deep Learning」を洗濯して「OK」を押してください。
画面遷移時にMachine Learning・Object Storageサービスの作成が行われます(未作成の場合)。インストールしたいスペースを聞かれるので、Watson Studioと同じスペースを選択してください。
次にプロジェクト詳細を定義します。
先程作成したMachine Learning・Object Storageサービスが右側に表示されているか確認してください。設定されていなければ「Reload」ボタンを押してみてください。
問題がなければ「create」を押します。
データセットをWatson Studioに読み込ませる
ストレージが用意できたので、ダウンロードしたデータセットをWatson Studioにアップロードします。
Watson Studio画面トップのメニューバーのプルダウン「Service」をクリックし、次いで「Data Services」をクリックします。
「Cloud Object Storage」メニュー中にある、先ほど作成したObject Storageサービスをクリック。
「バケットの作成」をクリック。
バケット作成ダイアログが出現するので、名前を入力してください。
念の為、ロケーションをus-geo
にします。その後「作成」をクリック。
するとデータをアップロードする画面が表示されます。
右上の「アップロード」ボタンをクリックしてファイルダイアログを開き、ダウンロードしたpklファイルをすべてアップロードしてください。ドラッグ&ドロップでもアップロード可能です。
このような感じでアップロードできたらOK。
その後、同じように学習結果出力用のバケットも作成します。
先ほどとは別名のバケットをもう一つ作成してください。
データセットのアップロードは不要です。
モデルの作成
次に学習・クラス分類のためのモデルを作成します。
Watson Studioトップページに戻り、「Get started with key tasks」メニューの「New Modeler Flow」をクリック。
遷移先の画面の「From example」タブをクリック。
今回はすでに用意されているDeep Learningのモデルを使います。
遷移したら、「Single Convolution layer on MNIST」のカードメニューをクリックし、「Project」が冒頭で作成したプロジェクト担っていることを確認して「Create」をくりっくしてください。
すると何やら数珠つなぎになった図が表示されます。
これはDeep Learningで用いられる「ニューラルネットワーク」と呼ばれる学習モデル(と最適化アルゴリズム等のオプション)の構成を表しており、これらの構成自体や、各パーツのパラメータを調整することでモデルの推論精度を高めたりすることができます。
一旦モデルの構造には変更を加えず、モデルの学習・テストに使うデータを設定します。
「Image Data」をダブルクリックすると下記サイドメニューが表示されるので、「Create a Connection」をクリックしてください。 Object Storageに接続します。
接続がうまく行った場合、「Data Connection」プルダウンが表示されるので、「Connect to project COS」を選択してください。すると続けて「Buckets」プルダウンが表示されるので、先程アップロードしたデータを含むバケットの名称を選択します。
その後「Train data file」「Test data file」「Validation data file」の所在を聞かれるのでそれぞれアップロード舌ファイルを選択し、「Close」をクリック。
最後にモデルを公開します。
画面右上のアップロードボタンをクリック。
ダイアログが出てくるので、名前が先ほど作成したモデル名であり、WML Instance の名前が冒頭で作成したサービスのものと一致するかチェックして「Publish」をクリック。
緑色の通知が出てきたら成功です!
さらにモデルの学習をすべく「or Train it in an experiment」をクリックしましょう。
モデルを学習する
先程のリンクをクリックすると、Experiment作成画面に遷移します。
Experimentはモデルの学習やテスト、精度推移の可視化などができる実験環境の単位を指します。
名前を入力し、作成したMachine Learning Serviceを選択してください。
その後下段の「Cloud Object Storage bucket for...」の「Select」ボタンをクリック。
「Cloud Object Storage connection」から「Connection to project COS」を選択し、 「Bucket containing training data」にはデータセットをアップロードしたバケットを、「Bucket for storing training results」には学習結果出力用のバケットを指定します。 指定したら「Select」をクリック。
新規experiment作成画面に戻り、「Add training definition」をクリックします。
先程作成したモデルを指定するため、「Existing training definition」タブ → 作成したモデル名を選択します。
すると「Training definition attributes」メニューが表示されます。 「Compute plan」はモデルの学習・テストに使う計算機リソースの構成のうち、どのGPUをどれだけ利用するかを選択します(台数や一台の性能が良いほどメモリや並列性が増し、学習やテストが高速になる)。「Hyperparameter optimization method」はモデルを学習する上でハイパパラメタ、つまり学習の際に予め設定しておくパラメータ初期値をどのように決定するかを指定します。今回は前者を「1 x NVIDIA® Tesla® K80 (2 GPU)」とし、校舎を「None」としました。選択したら「Select」をクリック。
「Create and Run」を押しましょう。
学習が開始されました!
遷移先の画面ではモデルの学習中の様子を見ることができます。 学習中のモデルの状態は「Queued」「In progress」「Completed」の順に遷移していき、「Completed」になると学習が終了したことを表します。
終了したら、詳細を見てみましょう。
学習が完了していることがわかります。
Logsには学習時のコンソールログも残されており、学習回数や、学習時点での学習データに対する分類精度等を見ることができます。
学習したモデルを保存する
学習したモデルは、保存して利用できるようになります。
先程の「Completed」状態にあるモデルの右端のメニュープルダウンから「Save model」を選択します。
保存用ページに遷移するので、名前を入力し、「Save」ボタンを押しましょう。
成功すると、緑色の通知が出ます。
「here」をクリックすることで、保存したモデルの詳細を見ることができます。 (またはメニューバー「Project」から作成したプロジェクトの「Assets」タブに遷移し、「Experiments」の項目で「Add Experiment」をクリックします)
保存したモデルをデプロイする
次に、保存したモデルをデプロイします。
デプロイすると、テストデータを使った検証や、API経由で分類器を提供することが可能になります。
今回はWeb Service としてデプロイしてみましょう。
先程のモデル詳細画面の「Deployments」タブをクリックします。
「Add Deployment」をクリック。
遷移先の画面
今回はテストデータセットを使った性能評価を行うので「Deployment type」の「Web Service」を選択します。 あとは名前を入力して「Save」をクリックします。
これだけでデプロイ完了です! 早速テストしてみましょう!
デプロイしたモデルをテストする
デプロイした結果作成されたDeployをクリックし、「Test」タブをクリックします。
冒頭でダウンロードしたmnist-keras-test-payload.json
の拡張子を.html
に変更します。
変更したあと、ブラウザでHTMLファイルを開きます。
開いたページのJSONファイルをコピーし、先程のDeploy画面のTestタブ内にあるフォームにペーストしてください。
「Predict」をクリックすると、クラス分類が開始されます。
元のJSONデータは数字の「7」を記した画像の濃淡値データを表しているので、帰ってきたクラス分類結果が「7」であれば分類成功です。
結果が帰ってきました!
レスポンスJSONのvalues
内配列の8番目の数値が1の場合、これは数字の7であるという分類結果になります。
上記画像では分類に成功していることがわかります。
まとめ
いかがだったでしょうか。
今回はMNIST分類の簡単な学習とテストを行いましたが、より複雑なモデルの構築、学習、テストももちろん可能です。
pythonスクリプトへのエクスポートなどもできるので、これからどんどん試していこうと思います。