【初心者向け】[環境構築不要][コーディング不要] MNIST を題材に GAN, GRAD-CAM を手軽に実行する on AAS 

# 目次

- 概要
- 用語
- 操作説明

# 概要

AAS([Amazing AI Studio](https://amazing-ai-studio.com/index_ja/))上で提供されているテンプレートを利用し、データ収集、前処理、学習モデル作成、訓練、検証、推論、データ生成、特徴の可視化方法について理解する

# 用語

- MNIST(Modified National Institute of Standards and Technology) とは
  画像処理のトレーニングとテストに使用される「手書き数字」の※大規模データベースです。
  ※大規模データベース：手書き数字画像｛トレーニング用:60,000 枚、テスト用:10,000 枚｝＋対応する画像の正解ラベル(教師データ)

- GAN(Generative Adversarial Nets) とは
  教師なし学習で使用される生成モデル（画像などを作れる）の一種。
  【コンセプト】贋作者と鑑定士の役を演ずる学習モデル 2 つを競わせる
  　・贋作者：Generator 　　　・・・鑑定士を騙せるようなデータを生成する（画像を作る）
  　・鑑定士：Discriminator 　・・・贋作者が生成したデータを贋作だと見抜く

- ACGAN (Auxiliary Classifier Generative Adversarial Nets)　とは
　Discriminatorに補助のクラス分類器を付けることでクラスを指定した画像生成が可能になったGANです。
　今回のMNISTを題材とした場合、0～9というクラスそれぞれの数字を指定して画像生成できます。

- GRAD-CAM(Gradient-weighted Class Activation Mapping) とは
  CNN(Convolutional Neural Network)を利用した分類を行った際、「画像のどの部分に注目して分類したのか」を可視化する手法

- AAS([Amazing AI Studio](https://amazing-ai-studio.com/index_ja/)) とは
  機械学習向けのビジュアルエディタと実行環境が一緒になったオンライン版 IDE のようなサイトです。
  プログラミングに関してはデータ収集、前処理、訓練、推論、データ生成、特徴の可視化全てをビジュアルブロックを利用しノンコーディングで実現できます。
  また、プログラムの実行は利用ブラウザの JavaScript でなされます。機械学習に関しては tensorflow.js を介して GPU 上（CPU 内臓の GPU も可）で実行されるため計算量が少ない分にはタブレッドやスマホでも訓練・推論が実行できます。
  https://amazing-ai-studio.com/index_ja/

# 操作説明

## [1/4] MNIST
データ収集、前処理、訓練、推論の流れを確認します

* [作品集](https://amazing-ai-studio.com/galleries/)のリンクまたは画面上部のGalleriesのリンクを押します
  ![001_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/2e9f044f-9700-7b35-8f68-7676a2126840.png)
* 『MNIST』を探して「USE THIS」ボタンを押してちょっと待ちます
  ![002_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/996b3b12-6829-9409-a764-6ba06f8ab1fc.png)
*  Workflows の一番下に『MNIST』が増えているのでそれを選択します
  ![003_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/14222a55-17d9-b936-0f5a-041331fd2478.png)
*  ビジュアルエディタを上にスクロールして以下の点を確認します
   - [データ収集] MNIST のデータを 6,500 件収集 (本来あるデータ全体の10分の1)
     ![004_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/d17508ae-db86-4480-1b32-5af5d5e5bea1.png)
   - [前処理] 収集したデータを「訓練」「検証＆テスト」用途に 85:15 の割合で分割
   - [前処理] 上記データのラベルを one-hot エンコーディングする
   - [学習モデル作成] 畳み込みとmaxPoolingを 2 組内包したモデルを作成
     ![005_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/bd972a64-c276-06d0-4c57-1b3cc7ec45bb.png)

   - [訓練/検証] 200 イテレーション回して数字の特徴を学習する。その際 5回に1回の割合で検証
     ![006_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/fa05aa73-c6b6-34c8-4b6b-deedba3db694.png)
   - [推論] ランダムにピックアップしたテストデータを学習済みのモデルに投入しての結果確認
     ![007_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/99c9c984-a11d-0901-a23b-1e7bbda5217a.png)

* 『RUN BLOCKS』ボタンを押してプログラムを読み込みます
  ![008_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/e3f3751a-a05e-af03-da96-3cc1953aa99a.png)

*  『LOAD DATA』から順番にボタンをポチポチ押していきます
  ![009_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/88fa1e95-a65d-26c8-b2bc-89b1aa6d684f.png)
*  訓練中は自動的にACC/LOSSの値が可視化されるので眺めて待ちます
  ![010_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/997d9738-ab05-987c-f517-83c9bba6f790.png)

*  推論した結果を『Images』タブで確認します
  ![011_goto_gallery.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/39c909f4-8656-244d-072b-4e95ce5a4030.png)


## [2/4] MNIST HANDWRTING RECOGNITION with Grad-CAM
自分で手書きした文字を推論で利用する、学習モデルの保存と読み出し、Grad-CAM利用の流れを確認します

* [1/4]同様に[作品集](https://amazing-ai-studio.com/galleries/)を開きます

* 『MNIST HANDWRTING RECOGNITION with Grad-CAM』を探して「USE THIS」ボタンを押してちょっと待つ
  ![002_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/c5fd9ffa-badd-2fcd-3ba4-182c1538b499.png)

*  Workflows の一番下に『MNIST HANDWRTING RECOGNITION with Grad-CAM』が増えているのでそれを選択します

*  ビジュアルエディタを上にスクロールして以下の点を確認します
   - [前処理] Grad-CAMへの入力に合うようにモノクロ1CHのデータをRGBの3CHになるように変換している
     ![002_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/c1fdcd0f-ac17-c314-15d7-ef42016907c4.png)
     ![002_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/3e0d85e5-5934-3919-3f23-290e47df867c.png)

   - [学習モデル作成] [1/4]との相違点としてGrad-CAMへの入力に合うようにモノクロ1CHからRGBの3CHに入力層の次元を変更してある
     ![002_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/bb4430b9-d1fb-d441-4fe8-8cced722a68a.png)

   - [訓練] 訓練後の学習モデル保存及び、それを読み出すブロック
   - ![002_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/38fc8296-0524-b1ec-2688-51ca3e7f31af.png)

   - [推論] Grad-CAMの結果をSketch上に描画
   - ![002_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/7a05e7a4-754d-efae-e52e-137992fbea39.png)


*  尚、PCで利用する場合はテンプレートのままではなく、訓練の対象を増やした方が精度が上がります
     ![002_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/82f03f93-bb23-931a-9c43-bcecb24e6d87.png)
      * MNIST の取得データを 16,250 件に変更する
      * 1イテレーションでピックアップする件数を200件に変更する


* 『RUN BLOCKS』ボタンを押してプログラムを読み込みます

*  『LOAD DATA』から順番にボタンをポチポチ押していきます
  -  但し、「LOAD PRE-TRAINDED MODEL」ボタンは押しません
  ![002_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/c18708e0-c208-4cf4-1a8a-ab51bd0b1e36.png)

*  推論時「DRAW CANVAS」にて数字を手書き後に「PREDICT」ボタンを押します
  ![002_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/ca546664-be65-35c6-0a3d-fe8e8a43e3e9.png)

*  推論した結果を『Sketch』タブで確認します
   - 最後のCNN層に於ける着目箇所がヒートマップで可視化されています
  ![002_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/d3c73327-8c3f-dc8a-3d52-625bf5d36003.png)

*  ブラウザ再起動後など、学習済みモデルを再利用したい場合
  - 「LOAD DATA」～「TRAIN MODEL」をスキップして「LOAD PRE-TRAINDED MODEL」を押し、学習済みモデルをロードします
  - ロード後、ロード前と同様に推論します
  ![002_012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/55d2bf89-9b34-2b4e-b41f-0bb122cf2e4d.png)

## [3/4] Simple MNIST GAN
ランダムなベクトルを入力として数字っぽい画像を作成できることを確認します

* 今回は『Workflow』ページ内で『Workflows』ビュー左側の『New』ボタンから『Simple MNIST GAN』のテンプレートを選択する
  ![003_001_simgle_gan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/2041069f-bc4e-07b3-72fa-d56fab7b8b40.png)

*  ビジュアルエディタを上にスクロールして以下の点を確認します
   - [訓練] Discriminator(鑑定士)とGenerator（贋作者）各々のオプティマイザーの存在を確認します
     ![003_002_simgle_gan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/11493400-f72b-3c64-9dde-0cfb6adc5c3d.png)
   - [生成] 画像を生成する際はランダムなベクトルを種としていることを確認します
     ![003_003_simgle_gan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/f26dbacd-7a71-84fb-087a-efca49a5f4bc.png)

* 『RUN BLOCKS』ボタンを押してプログラムを読み込みます
   - データ生成専用のボタンが確認できます

      ![003_004_simgle_gan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/d1163c5b-9150-1cb3-947f-8b1678070e24.png)

* 『LOAD DATA』、『TRAIN MODEL』と順次押します

*  訓練中の動作
   -  LOSSはDiscriminator(鑑定士)とGenerator（贋作者）の両方が可視化されます
   -  50EPOCH毎に画像が生成され、その内容は『Images』タブにて確認します
   -  『Images』タブでは追加画像が左上に追加挿入されると見やすいので『Prepend』を有効にします
   ![003_005_simgle_gan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/0290e958-2c63-b95e-6c18-6365f4738d50.png)

*  鑑定士、贋作者のLOSSの推移と、贋作者の作成した数字っぽい画像を確認します
   ![003_006_simgle_gan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/98e1dbe9-7920-f27c-0431-49c471098089.png)

*  『GENERATE FROM GENERATOR』ボタンを押すと新たな画像が生成できます
   ![003_007_simgle_gan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/a179665d-25ae-41f1-a1d5-913310608b5d.png)


## [4/4] ACGAN on the MNIST Dataset
0～9というクラスそれぞれの数字を指定して画像生成できることを確認します

* 『ACGAN on the MNIST Dataset』のテンプレートを選択します
  ![004_001_acgan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/bd7a2cfc-11d6-3066-3da3-97c867b2233b.png)

* 『RUN BLOCKS』ボタンを押してプログラムを読み込みます
*  『LOAD DATA』から順番にボタンをポチポチ押していきます
*  [訓練中] 生成される画像がみずらいです
   - 0～9の10個分横並びのためサムネイルが小さく識別しずらいです
   - Prependスイッチ右のプルダウンでサムネイルのサイズが切り替えできるので『Original』を選択します
   - ![004_002_acgan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/3f601786-f990-6c7b-23c7-1b4d2a6445b1.png)
   - ![004_003_acgan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/8af0ad92-004a-2edd-4adc-b637bb78e209.png)

*  最終的にこのような画像の生成が確認できます
   - 300 EPOCHまでは数字にはみえないです
   - 400 EPOCHから突然数字っぽくなってます
   - 550 EPOCH以降は、テンプレートのままのハイパーパラメータではあまり生成画像の変化は見られません
   - ![004_004_acgan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133854/a4e5e854-f830-c32e-3968-9b8785e8d1ef.png)