【古い記事です】【2018/8月更新】Watson Studioのディープラーニング機能(DLaaS)を使ってみた

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a0f42d44-631b-7557-c959-1dda7ad3920b.png)

:warning: <Font color="red">当記事は2018/4月に初投稿しましたが、当記事で紹介している**Neural Network Moderは2020/07/31付けで廃止となり、Watson Studioから除去[^6]されました。**記事自体はアーカイブの目的でこのまま残しますが、当記事の内容を参考になさらないようにお願いいたします。</font>

[^6]: 先々、AutoAIに旧NeuNetSの流れのディープラーニング系の新機能が搭載されるとの噂あり。時期不明。
~~:triangular_flag_on_post: 当記事は2018/04に公開したのですが、その後の変更で記事内容や画面コピーが古くなりました。よって**2018/08月時点でアップデート**しました。~~

# はじめに
(記事執筆時点: 2018/04/02) 先般、「[IBMのThink 2018で発表されたAIプラットフォーム「Watson Studio」をザクッと紹介してみる](https://qiita.com/ishida330/items/cd851bb2c461f64b02dd)」という記事を書きました。そこで軽く紹介したWaston StudioのDLaaS(Deep Learning as a Service)機能を使ってみたので、チュートリアルに沿って詳細をご紹介します。

# Watson StudioのDLaaS(Deep Learning as a Service)の概要
概要ご紹介は重複するので前掲の記事の[ここ](https://qiita.com/ishida330/items/cd851bb2c461f64b02dd#deep-learning%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0)をご参照ください。概要の絵だけ、再掲しますね。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/db827145-1780-9180-d65f-ad6b8c9f022e.png)

# いい話と悪い話
のっけからサゲる話ですいません。以下ぶっちゃけの個人的な所見ですが、現時点でのDLaaS機能にはいい話と悪い話があると思います。

### :smile: いい話
- Watson Stuidoは無償の**ライトアカウントでも使えます**。DLaaSもお試しいただけます。
- **一切コーディングせずに**、独自のニューラルネットワークのモデル構築・トレーニングができます
- NNのデザインからデプロイまで、全サイクルがカバーされています 
- UIではなく全部APIでプログラミングすることもできます

### :pensive: わるい話
- 上記の利点を享受できるのは、ディープラーニング/ニューラル・ネットワークの基礎知識があり、TensorflowやKerasなどフレームワークのこともそれなりにわかっている方＝**「専門家」に限られる**でしょう。
- Watson Studioにはニューラル・ネットワーク・デザイナーなどのUIツールもありますが、パレットの中身は「Conv2D」「シグモイド」「ReLU」「Softmax」など**一般の利用者には謎の単語**のオンパレードです。UIがあるからといって**SPSS的な感覚で「現場の(LOB)ユーザーでも簡単にディープラーニングが」的な理解をすると、足をすくわれます**。（残念ながら、それはたぶん無理です）まあ、通常はデータサイエンス領域で現場ユーザーの方がやりたいのは何かの「予測」であって、それは無理にニューラル・ネットワークを使わずとも、SPSSなど従来の予測分析ツールで、できてしまいます。(というか、そのほうが望ましい) 現場の業務ユーザーの方がニューラル・ネットワークの対象領域である「イメージ」や「テキスト」｢音声」などの判定器を作るのは異例かと思うので、上記は杞憂かもしれませんが。。

要は、DLaaSは「今までTensorflowとかKeras on Jupyterでプログラムをガリガリ書いて、パラメーター最適化やモデルの管理、本番デプロイなどなどプロジェクト周りで色々とご苦労してきて、難しさ（と楽しさ?）を知っている人」から見ると「えー！こんなに楽になるの？」と思うものなのかな、と思います。

なお、上記は「ツールの機能がプアだから専門家でないと使えない」のではないです。現時点では、ニューラル・ネットワークは他の機械学習の技法に比べ、より実験・探索的(Experimental)です。つまり、層を増やしたり、独自の活性化を試みたり、パラメーターを変えたり、と何度も試行錯誤を繰り返して最適な性能のモデルを導き出すのが通例です。（だからNNになるとGPUが欲しくなる) 要は「テントを買うか・買わないか＝購入可能性の予測」のように、「教師データを分割・入力して適切な手法を選べば、(まあ、それなりの)結果が出る」ものよりはるかに手間がかかり、複雑です。先々、なんらかの手法面でのブレイクスルーがあるかもしれませんが、現時点ではこの方式にならざるをえないのだろうなー、と思います。（でなければWatson APIのような「トレーニング済み」のサービスを使うか)

# やってみた
ということで、ちと気分を下げましたが、気を取り直してやってみましょう。

## シナリオ
[Tutorial: Single convolution layer on MNIST data](https://dataplatform.ibm.com/docs/content/analyze-data/ml-canvas-nnd-mnist-tutorial.html)にチュートリアルがあります。「お約束」の「手書き数字の認識」です。これをエンドTOエンドでやってみます。(githubの[IBM Watson Studio Lab](https://github.com/atinsood/watson-studio-lab)も似たような内容ですのでご参考まで)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/097420f3-e16c-c405-6e16-6319d6ebe778.png)

:triangular_flag_on_post:当記事ではわかりやすさ優先で**全部UIでやります**が、同じことはPythonなどのプログラミングでAPIを経由して行ったり、CLIで行うこともできます。「UIは俺の流儀じゃない」という硬派の方は[Tutorial: CLI with TensorFlow](https://dataplatform.ibm.com/docs/content/analyze-data/ml_dlaas_tutorial_tensorflow_cli.html)が参考になります。
:triangular_flag_on_post:(2018/5/22) 英語ですが当記事と似たようなことをやってる記事 [Deep Learning and Watson Studio](http://lzrvc.com/deep-learning-and-watson-studio/)があったのでご紹介します。NNDで生成したソースをPC上でも実行しています。

## 事前準備
:small_blue_diamond:以下の３つのサービスのインスタンスを「**US-Southに**」作成（US-Southであれば、既存のものを利用できます）

:triangular_flag_on_post:2018/4月時点では、ディープラーニング系の新機能は「**US-Southのみ**」「**ベータ**の位置づけ」で提供されていますので、ご注意ください

- Studio ( アイコンはWatsonカテゴリーにあります)
- Machine Learning( 同上 )
- Object Storage

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f4f09dfb-1e73-e3ad-fe00-30c9b2f39ceb.png)

:small_blue_diamond:Tutorialで使うデータ（画像)として、以下の３ファイルを[ここ](https://ibm.ent.box.com/v/NNM-sample-data)からPCにダウンロードしておきます。(MNISTのトレーニング、テスト、検証用データをpickle形式に保存したものです)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f07b0b15-90f4-735d-cb32-ffe72ea2fc86.png)

## ICOS(IBM Cloud Object Storage)側

以下の手順でICOS上に入出力用にバケットを各１つずつ定義し、上記の3ファイルを入力用のバケットに格納(アップロード)します。

- チュートリアルでは入力/出力ともICOSのバケット上のファイルを使用します
- 操作はAPIでも可能ですが、簡単なので今回はUIでやります

#### ICOSのBucket準備

ICOSのBucketsタブでバケットを作成します。（以下は「空っぽ」の状態での画面ですので、皆様の表示は多少違うかもしれません)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c3de56b1-fd72-89d6-c48d-df7608a752af.png)

:small_blue_diamond:入力用のバケットに適当な名前を付けて、:warning:**ロケーションはus-geoを選んで**、残りはデフォルトで「作成」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b6228e57-7d7a-55b9-15ce-d1ffb3b59c0a.png)

作成したバケットに、先ほどダウンロードした３ファイルをアップロードします
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/76afb04e-81f0-1c1e-e0ce-b3a0d0454c96.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d7175fd3-714b-c93d-98b8-0e1065b1515a.png)

アップロードできました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7e3cc79a-a176-2721-0023-d3ae69045817.png)

:small_blue_diamond:同様に出力用のバケットを作成しておきます. :warning:**ロケーションはus-geoを選んでください**

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/750657e8-52ea-a4fe-4f7a-dc53cb8dfc8a.png)

:arrow_right:これで準備ができました！では本筋のWatson Studioに進みましょう

## Watson Studio側

#### (なければ) プロジェクトの作成

Watson Studioを起動します。「Get Stated」ボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e98fb234-7276-c84f-d024-f970d07492da.png)

:triangular_flag_on_post: プロジェクトを未作成であれば、以下の作業で作成します。(既存のものも使えます）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b3e60e44-21f5-2dbe-7250-c917f1ae2eef.png)

デフォルトの「Complete(全部いり)」を選んで「OK」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/83e61b66-68f2-ab4e-3f59-bf4b2b8a578a.png)

お好みの名前を指定のうえ、既存のICOSのインスタンスと関連付けて「Create」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f8a5282d-16fb-f76b-494e-2493049728bf.png)

プロジェクトができました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c12070f0-fdfb-db3a-acd8-d9a2076579b3.png)

#### Machine Learningサービス

プロジェクトに自分のMachine Learningサービスのインスタンスを関連付けます。
:triangular_flag_on_post:既存のプロジェクトで、すでに関連付けが済んでいるなら、当作業は不要です

「Settings」タブ
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7253a621-33a0-0e67-4b68-b76c6deaf460.png)

「Associated services」で

- 「Add services」-「Watson」[^1] をクリック
-  Watsonのサービス一覧から「Machine Learning」を選択して「Add」- 
- 「Exsisting」からご自身のインスタンスを選択して「Select」
- (未定義なら「New」で作成もできます）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2b5a9dab-baef-e0c7-e19c-5d585014f770.png)

[^1]: 以前はMachineLearningというエントリーがありましたが、Watsonに統合されました

Machine Learningサービスのインスタンスがプロジェクトに関連付けされました
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/973d14e9-d6c4-20e0-f4db-b4f7d1e5311e.png)

#### Modeler Flowの作成

プロジェクトのパネルに戻り、右上の「Add to project」ボタンで「Modeler flow」を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/724a79f3-4a1f-e0a1-9a62-f694c03d6da5.png)
今回は出来合いのチュートリアルで行うので「from example」タブで「Single Convolution layer on MNIST」を選択して「Create」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a69f8f0a-25cd-4ad8-0495-3577b013a5ba.png)

#### Neural Network Designer

Neural Network Designerが起動してサンプルのフローが表示されます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/15a66e1a-84dc-95cc-31e7-0b0bf31e9528.png)

:triangular_flag_on_post:今は使いませんが、下記の赤い丸のマークをクリックすると左側にパレットが表示されます。実際はここからドラッグ＆ドロップでニューラルネットワークをデザインしていきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9b0b87a5-a8f7-d921-366b-930470c4bb07.png)

入力となるMNISTの画像ファイルを定義します。開始点の「Image Data」を右クリックして「Open」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/83d656c3-8ee4-2257-0d97-677d1246a11a.png)

右側にパネルが表示されるので、以下の手順で先ほどICOSにアップしたファイルを指定します

1. 先頭の「DATA」セクションを展開
1. 「Create a connection」ボタン
1. Data Connectionのドロップダウン・リストから「Connection to project COS」を選択
1. 「Bucket」は入力ファイル用のBucket
1. トレーニング・データ、テスト・データ、検証用データのファイルを各々指定
1. 「Save」ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/47e0d248-a93b-b7f4-4fa9-5c466bb8f128.png)

:triangular_flag_on_post: このへん、ちと操作がややこしいので、ご参考動画です。

![nnd-04.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/e3e31b1d-e7aa-b7f2-9730-5500e3793ed5.gif)

このサンプル･フローはデフォルトでも良い精度が出る[^5]はずです。

[^5]: :warning:4月時点で提供されていたサンプルは、デフォルトだとモデル性能が悪かったので、性能を上げるためのチューニング情報を記載していました。その後サンプルが改善されデフォルトでも97%以上の精度が出るようになったので、以前の記述は削除しました。

#### Training DefinitionのPublish
ではニューラル・ネットワークのトレーニング定義をPublishします。
右上の上向きの矢印のアイコンをクリックし、お好みで名前を指定します。
Select WML InstanceでWatson Machine Learningのインスタンスを指定して「Publish」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/797d9b62-6df5-5cbf-5949-3e9761b6847d.png)

成功しました
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/bf053096-c8a2-27c1-56e6-ef387759dd12.png)

#### (オプション)Training Definitionのダウンロード
オプションですが、デザイナー上の定義を各フレームワーク用のソースコードに変換した結果をダウンロードできます。中身にご興味がある方は、見てみるとよいかと。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8d077443-ec63-7276-cc6a-8cba61c6459f.png)

独自のソースコードがあり、前述のGUIベースのNeural Network Modelerを使わない場合は、モデルを定義するフレームワークのソースとトレーニング定義を準備すれば、コマンドやPython Clientを使ってExperiments(実験)を実行できます。トレーニング定義とは、下記のようなJSONファイルです。ドキュメント[Create a Training definition](https://dataplatform.ibm.com/docs/content/analyze-data/ml_dlaas_working_with_training_definitions.html?audience=wdp&context=analytics)に説明があります。

<details><summary>Training Definitionの例</summary><div>
```yaml
name: training-definition-1
description:  Simple MNIST model implemented in TF
framework:
  name: tensorflow
  version: '1.5'
  runtimes:
    name: python
    version: '3.5'
training_data_reference:
- name: MNIST image data files
  connection:
    endpoint_url: <auth-url>
    access_key_id: <username>
    secret_access_key: <password>
  source:
    bucket: mnist-training-models
    type: s3
```
</div></details>

#### Experiment(実験)の定義

トレーニング定義を使ってExperimentを定義します。

Publishが成功したら、「train it in an experiment」のリンクをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/aa832d44-236a-5342-ef85-d20f1a0dc335.png)
:triangular_flag_on_post:プロジェクトのAssetタブで「Experiments」を追加するのでも結構です。同じです。 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c7a23b72-3879-e51a-b8a2-210285baf75f.png)

お好みの名前を指定して①ICOS ②トレーニング定義(さっきPublishしたもの)を各々指定します。以下、順を追ってご紹介します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7dc94b31-b2e8-9656-6da2-6d109aa6ddab.png)

:small_blue_diamond: (**パネル左側**) 入出力に使うオブジェクト・ストレージの指定
「Select」でパネルが開くので、「Existing connections」タブから下記を指定して「Select」ボタン

- ICOSへのコネクション
- トレーニング・データの入っているBucket
- 実行結果を出力するBucket

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0f40a25a-2fd8-70a2-9720-fff73d8efe89.png)

結果、以下のようになります
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a9db9511-0bf9-04fb-f81e-886457155f39.png)

:small_blue_diamond:(**パネル左側**) Training Definition
右上のAdd training definitionボタンでパネルが開くので、「Existing training definition」タブを選択。ここでGPUの種類やハイパーパラメーター最適化の設定を行います。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3f18b2c4-f33f-a1d2-d552-62c6f1d8b4ad.png)
下記を指定して「Select」ボタン

- Compute PLAN - 1/2 x NVIDIA Tesla K80(1GPU)
- Hyperparameter optimization method - none

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/44a26b1a-4131-8e7d-bea7-648050781062.png)

:triangular_flag_on_post: UIの構造からおわかりの通り、1つのExperimentには複数のTraining Definitionを登録できます
:triangular_flag_on_post: 無償のライトアカウントでは50Capacity Unit Hoursまで使えます。Environmentタブで確認できます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e313f1aa-dea5-5113-a874-70490226609c.png)


#### Experiment(実験)の実行
指定が完了したら、モデルのトレーニングを実行しましょう。「Create and Run」ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/07f5c5a8-e095-bd7b-4b4e-7bceab10c416.png)

起動直後はキューで実行待ち状態ですが、時間経過と共に状態が変わっていきます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/13774d31-43ed-f8ee-4f8c-4ab7571feb5e.png)

実行中（および完了後）にトレーニングの名前をクリックすると
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4b7322e1-bf11-2a85-7689-9a6be1861d6f.png)

状況や実行ログを参照できます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0a5498c5-063b-18fc-dddb-21ab56bf656a.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/83683a69-59db-43f2-3c2a-30279a2be40e.png)

トレーニングは２分半で完了しました。トレーニングの結果がサマリー表示されます。VAL_ACCが97.6%なので良好な結果といえると思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/bccfd667-a484-615e-1ba0-03c9676fcf13.png)

| カラム | 意味 |
|:---|:---|
| ACC | トレーニング・データに対する精度(Accuracy) |
| LOSS | トレーニング・データに対する損失関数の値 |
| VAL_ACC | 検証データに対する精度(Accuracy) |
| VAL_LOSS | 検証データに対する損失関数の値 |

:triangular_flag_on_post: 一般にAccuracyは大きいほうが性能が良く、損失関数の値は小さいほうが性能が良いと解釈[^2]します。

[^2]: ただしACC>VAL_ACCで、かつ進行に従いVAL_ACCがだんだん小さくなっていく傾向がある場合はトレーニングデータに最適化されている＝過学習といえますので、望ましくありません

トレーニングの名前をクリックすると「Monitor」パネルでトレーニングの精度や進み具合が見られます。実行ログから値を地道に拾わずに済みます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/249c6506-6762-cfd3-4f12-bd5164ac5bc0.png)

今は１ジョブしかありませんが「Compare」タブでは複数の実行の比較もできます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f4c57e4a-6b9c-e07e-cd6c-9d8d556cd6a1.png)


実行ログや訓練後のモデルはICOSの出力Bucketに保管されています。モデルは.h5の形で永続化されているので再利用もできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a7e52417-ca4d-52b2-7ed8-224169c1b6f7.png)

ご参考資料として実行ログを[ここ](https://github.com/ishida330/Qiita-DLaaS/blob/master/training-log.txt)に掲載しておきますね。10回トレーニングを繰り返している様子が見られると思います。

#### モデルの保管
本来はニューラル・ネットワーク・モデルのトレーニングは前項のデザインやパラメータを変えて何度も繰り返すプロセスでしょうが、ここでは「満足できる性能が出た」ものとして、モデルを保管します。

モデルの右端の「Action」で「Save Model」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0f318c2d-f1de-ac03-f0f2-d9cdaea1e2d4.png)

お好きな名前を付けて「Save」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/17fd5127-c32a-d7b6-879b-e7fa5444f52d.png)

Saveできました

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c9cd690d-efab-84a0-da6e-1118fdcad207.png)

プロジェクトのAssetタブの「Watson Machine Learning models」に登録されています

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f6fc09af-d3ff-4ac4-efe5-437aef7f504a.png)

#### モデルのデプロイ

ではデプロイです。メッセージの「View model details **here**」のリンクをクリックするか、またはダッシュボードからModelsの名前をクリックして、モデルを開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/08f4d75a-aa5d-0b44-d6ab-3d3fb9d6ce26.png)
「Deployments」タブで「Add deployent」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3853e5af-8893-6b54-0c84-95f99f689084.png)

今回はRESTのWebサービスとしてデプロイしましょう。お好みの名前を指定して「Web Service」ボタン[^3]を選んで「Save」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7878b92e-27b3-3142-6499-6b9542649f89.png)

[^3]: Virtual(containers_and_files)はCoreML用です

デプロイされました
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/864d2abd-fc7e-eba4-d1d9-dcd5c3d70d8e.png)

#### モデルの利用

では実際にMNISTの手書き文字を認識させてみます。

サービスをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3113f7e2-3271-c149-edc3-2ab17ee24b03.png)

パネルが表示されます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9b1ee27f-98fe-76a1-c850-c76050441277.png)

「Test」タブでUIを用いて対話式にテストできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9ed24caa-d0de-3f98-9b83-f1a56789c109.png)

:triangular_flag_on_post:「Implementation」タブではRESTエンドポイントやサービスを呼び出すためのコード・スニペットが表示されます。資格情報だけ書き換えれば、そのままコピペで動くので便利です。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/56ffb5a7-c5ff-661a-36b0-7dd023540552.png)

では実際にRESTエンドポイントをUIでテストします。

##### 【Fast Path】～デモなどで、とにかく動かしてみたい方へ

[Githubの「ここ」](https://github.com/ishida330/Qiita-DLaaS/blob/master/wml-input.json)に以下のイメージのjson表現[^4]を置いてあります。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ef15e638-d47b-6046-feb3-00a6e6eb4333.png)

[^4]: 当初提供されていたサンプルフロー中のロジックでは、RGBの各色の値(0-255)は÷255されて0-1の範囲に標準化されていました。最近の変更でこの標準化が無くなり0-255のままの値で処理するようになっています。よって以前の標準化されたテストデータでテストすると正しい判定結果になりませんのでご注意ください。

「Enter Input Data」欄に上記ファイルの中身(長いです）を全部コピペして、「Predict」ボタンを押すと、右側に判定結果が表示されます。今回のチュートリアルのフローはsoftmaxを使っているので、イメージが0-9の各々の文字である確信度が10エントリーのリストとして返ってきます。はじめ([2]番目の値が0.9999855756759644で最も大きいので、イメージを「2だ」と判定していることがわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ebb42601-5ade-1f32-0721-e7e5d398a606.png)


##### 【細かく】～サービスのI/Oをきちんと理解したい方へ

そもそも、今回のチュートリアルのフローをRESTでスコアリングするときの入力と出力はどういう形になるのでしょうか。Machine Learningでは、普通はテキストのjsonデータを投げて予測結果を受け取りますが、今回は入力はイメージです。実は、私もわからなかったので[Stackoverflowで聞いてみました](https://stackoverflow.com/questions/49526227/deep-learning-how-can-i-test-the-mnist-tutorial-model-on-wml)。結果、要は下記です。

:small_blue_diamond:イメージデータの入力は初めにConv2Dで処理されるので、Tensorflowの[tf.nn.conv2d](https://www.tensorflow.org/api_docs/python/tf/nn/conv2d)で期待しているinputの形、すなわち [batch, in_height, in_width, in_channels] の4次元の形式になります。
> Given an input tensor of shape [batch, in_height, in_width, in_channels] 
> 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/fe7a1abf-3db5-774c-2002-a4721ee9e615.png)

今回はshapeとしては[1,28,28,1]の形式です。(バッチサイズは1枚のイメージなので1、pixelは28x28、in_chanelsは白黒なので1) 上記に沿って作ったjsonが前掲のJSONファイルです。
別のイメージを入力したい方のために、[ここ](https://github.com/ishida330/Qiita-DLaaS)にお好きなMNISTデータをJSONに変換するノートブックをおきましたので、よろしければご利用ください。

:small_blue_diamond:同様に出力(判定結果）は[Softmax](tf.nn.softmax )を使っているので判定結果は0-9の各々についての確信度がリストで返ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/03efef2d-d813-544f-e677-2b015b337836.png)

#### （おまけ）作った手書き数字認識モデルを使ってみよう！(node.js)
技術系ブログ  [まだプログラマーですが何か？](http://dotnsf.blog.jp/)とマンホールで有名なきむらさんが、当記事のフォローで「[IBM Watson に MNIST の手書き数字を学習させて問い合わせするサンプル](
http://dotnsf.blog.jp/archives/1070827338.html)」という記事を書いてくれました。当記事で作ったモデルを使って、ブラウザー上で書いた手書きの数字イメージを認識させるアプリを公開してくれています。要はこんなの↓↓

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4706b8d3-6723-9efb-265c-55360f25f8b7.png)

サイト上でサンプルアプリが動いていますし、ソースをgit cloneして自分のPCのnode.jsで動かすのも、bx cf pushでIBM Cloud上で動かすのも簡単です。ご興味あればお試しくださいませ~。きむらさん、あざす！:+1:

#### (おまけ２）作った手書き数字認識モデルを使ってみよう！(Python)

[@makaishi2](https://qiita.com/makaishi2)さんも記事「[Watson Studioで学習した深層学習モデルをアプリケーションから呼び出す](https://qiita.com/makaishi2/items/9ea034648b2e53f65068#_reference-67e910f6640c6687fc8b)」でモデルをPythonアプリから呼び出すサンプルを公開してくれています。あざす！


以上、MNISTデータセットを入力にして、NNモデルのトレーニング、デプロイ、利用までEnd-to-Endでご紹介しました。ライト・アカウントでもお試しできますし、他にもNeural Network Designのサンプルが揃ってますので、皆様もお試しくださいませ。ではHappy Deep-Learning !　:smile:

  
#### 改定履歴
(2018/05/10) 以下の誤りを訂正しました

- ICOSのHMACキーを生成しなくてもBucketにアクセスできるので記述削除
- トレーニング定義の例がフロー定義になっていたので訂正

(2018/5/11) 以下を追記しました

- Neural Network Designerのデフォルト・フローでExperimentを実行した際にモデル精度が良くない時の改善方法を追記
- きむらさんの記事をご紹介で追記

(2018/5/22) 以下を追記しました

-  英語のBlog記事 [Deep Learning and Watson Studio](http://lzrvc.com/deep-learning-and-watson-studio/)をご紹介

(2018/8/14) 記事執筆時点以降に各種の変更がされたので、記事内容の更新＆画面イメージの取り直しを行いました。サービスの主な変更点は以下です。

- プロジェクトとサービスの関連付けでWatson Machine Learningは「Watson」区分になった（「Machine Learning」という区分が無くなった）
- サンプルMNISTの生成するロジックが一新され①RGB値の標準化(÷255)が行われなくなった② Accuracy, Loss Funcなどの値を返すようになった ③フローのSGDがADAMに変更されデフォルト設定でも良い精度が出るようになった
- Experiment上でAccuracyなどの性能情報を表示できるようになった-