10分間で画像認識モデル構築byKeras~機械学習への第一歩~

<meta name="description" content="15分間でkerasで画像認識モデルを構築する説明と使用例を掲載しています。Google Chromeブラウザが開けるPCがあればOKです。">

## はじめに

### この記事を読むと?

 **難解でとっつにくいイメージのある機械学習について、実際にコードを動かしながら、最短で体験することができます。**


### なぜこの記事を書いたのか

機械学習やディープラーニング学ぶ方（またはこれから始める方）が増えています。
今は優れた書籍やオンライン上の教材が豊富にあり、多様な選択肢があります。素晴らしい時代ですね。
しかし残念ながら、何かしらの教材で挑んでみたものの、実際に機械学習を実装する手前で挫折してしまう方も少なくないと感じています(そしてそれは本人の能力のせいではなく、わずかな周囲の環境やタイミングといった運によるものが大きいと思います)。
機械学習を習得するためには、PythonやRといったプログラミング言語の習得はもちろん、ある程度の数学の素養や、環境構築が必要です。それらでつまずき、「自らの手で機械学習を動かす」という経験をできないのはとても惜しいことです。

そこで私が提案したいのは、**本格的な勉強を始める前にまずざっとでいいので、「ゴールを体験して全体像を概観する」**ということです(=機械学習の場合はコピペで良いのでモデルを構築してみること)。
ゴールの見えないマラソンを続けることは非常に困難ですが、ゴールに至るまでの道筋が明確に見えてさえいれば、その足取りは確かになることでしょう。
また、最初にゴールを意識することで学習効率が高まるという効果も期待できます。

「機械学習」や「ディープラーニング」と聞くと難しそうですが、実は**モデルを作るだけなら簡単**にできます。**環境構築も不要です。**

忙しいあなたの時間を、今日という一日の10分間だけ機械学習を学ぶこと使ってみませんか?

### 対象者

・機械学習に興味がある人
・これから機械学習の勉強を始める人
・勉強を始めたけど序盤で躓き、中々アウトプットまで進めない人

### 環境

・Google Chrome
・Google Colaboratory
(Chromeブラウザさえ開ければ、PCはMacでもWindowsでも何でも大丈夫です）


## セットアップ

今回はローカルに環境を構築せず、ブラウザ上から「Google Colaboratory」というクラウド実行環境を使います。
初めて聞く方も身構えないでください!Colaboratoryとは**「ブラウザから簡単に使えて、無料の、高性能の機械学習・ディープラーニングを実行できる環境」**です。流石Google様です。
高価なGPU機材が必要なイメージがあるかもしれませんが、必ずしもそうではないんですね。

### Colaboratoryへサインアップ

さあ、Colaboratoryを始めましょう!
Colaboratoryは個人のGoogleアカウントに紐づいています。
下記URLから、ご自身のGoogleアカウントでColaboratoryでログインしてください。

[Colaboratory へようこそ](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

これで完了です!!!なんと、Googleアカウントでログインするだけなんですね。なんて簡単でしょうか。

### ファイル作成

さて、次は実際にコードを書くための場所を作成しましょう。
といっても、驚くほど簡単なので安心してください。
スクショの通り、画面右上の「ファイル」タブから「ノートブックを新規作成」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438597/8254bf74-abd8-87c1-2ad0-f4f0c184897c.png)

これで作成が完了しました！
このままでも良いですが、せっかくなのでファイル名を変えてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438597/b28ddf91-6790-3699-6daa-746ed4238f8a.png)

「firstStep.ipynb」とでもしましょうか。（面倒な方はスキップしてOKです）


## やってみよう！~kerasで画像認識~
さあ、いよいよ本番です。機械学習の世界へ入門してみましょう。
今回は「ゴールを経験する」ということが目的なので、コードをコピペするだけでOKです。
コードの説明の意味は今は理解せずとも良く、「ふーん」とでも聞き流してください。

### 基本モジュールのインポート

まず、各種モジュールをインポートしましょう。

```python

import tensorflow as tf
import keras
import numpy as np
from matplotlib import pyplot
%matplotlib inline
import os
import distutils
if distutils.version.LooseVersion(tf.__version__) < '1.14':
    raise Exception('This notebook is compatible with TensorFlow 1.14 or higher, for TensorFlow 1.13 or lower please use the previous version at https://github.com/tensorflow/tpu/blob/r1.13/tools/colab/fashion_mnist.ipynb')


```

機械学習を勉強している方ならおなじみですね。
tensorflowモジュールとnumpyモジュールを、それぞれ```tf```,```np```と扱いやすい名前をつけてインポートしています。

tensorflowとkerasをそれぞれインポートしています。実は```import keras```は省略しても今回のコードは問題なく動作します。そもそもkerasはtensorflowのラッパー言語、つまりtensorflowを簡単に扱えるようにしたものですので、バックエンドではtensorflowが動いています。できるようにしたものです。分かりやすいのでわざわざkerasもインポートしています。

numpyは、機械学習の膨大な計算を高速に行うためのモジュールです。numpyのおかげで機械学習やデータサイエンスはPythonが主流になりました。

matplotlibは出力結果をグラフ等で可視化するためのモジュールです。

osモジュールはMacのterminalやWidowsのcommand lineのような、OSっぽいことを実行できるようになります。ディレクトリ操作とかですね。

distutils?これは耳慣れない方も多いでしょう。Python公式ドキュメントで調べてみましょう。
[Distutilsの紹介-Python3.8.0ドキュメント](https://docs.python.org/ja/3/distutils/introduction.html)
disututilsモジュールはPython標準のパッケージ管理ツールです。
import distutilsの次のif文は、TensorFlowのver.を管理しています。
(if文にこんな使い方あるんですね。面白い〜)



### データセットの準備

```python
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()

# add empty color dimension
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
```
今回はtensorflowに備え付けのサンプル用のデータセットを使うのうで、別途インポートする必要はありません。
Python中級者の書き方として、複数の変数にまとめて値を代入することができます。これも機械学習を勉強している方にはお馴染みの書き方ですね。


### モデルの定義

```python
def create_model():
  model = tf.keras.models.Sequential()
  model.add(tf.keras.layers.BatchNormalization(input_shape=x_train.shape[1:]))
  model.add(tf.keras.layers.Conv2D(64, (5, 5), padding='same', activation='elu'))
  model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
  model.add(tf.keras.layers.Dropout(0.25))

  model.add(tf.keras.layers.BatchNormalization(input_shape=x_train.shape[1:]))
  model.add(tf.keras.layers.Conv2D(128, (5, 5), padding='same', activation='elu'))
  model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
  model.add(tf.keras.layers.Dropout(0.25))

  model.add(tf.keras.layers.BatchNormalization(input_shape=x_train.shape[1:]))
  model.add(tf.keras.layers.Conv2D(256, (5, 5), padding='same', activation='elu'))
  model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
  model.add(tf.keras.layers.Dropout(0.25))

  model.add(tf.keras.layers.Flatten())
  model.add(tf.keras.layers.Dense(256))
  model.add(tf.keras.layers.Activation('elu'))
  model.add(tf.keras.layers.Dropout(0.5))
  model.add(tf.keras.layers.Dense(10))
  model.add(tf.keras.layers.Activation('softmax'))
  return model
```

層毎にドロップアウトとバッチ正規化を施した、3層から成るCNNでモデルを構築します。
(強そうな用語の連続パンチですね!ここでは一旦スキップしてください)

### モデルの訓練

訓練データを使って、モデルを訓練しましょう。
下記コードを実行してみると・・・？

```python
resolver = tf.contrib.cluster_resolver.TPUClusterResolver('grpc://' + os.environ['COLAB_TPU_ADDR'])
tf.contrib.distribute.initialize_tpu_system(resolver)
strategy = tf.contrib.distribute.TPUStrategy(resolver)

with strategy.scope():
  model = create_model()
  model.compile(
      optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3, ),
      loss='sparse_categorical_crossentropy',
      metrics=['sparse_categorical_accuracy'])

model.fit(
    x_train.astype(np.float32), y_train.astype(np.float32),
    epochs=17,
    steps_per_epoch=60,
    validation_data=(x_test.astype(np.float32), y_test.astype(np.float32)),
    validation_freq=17
)

model.save_weights('./fashion_mnist.h5', overwrite=True)
```

ギュイーンとEpochが1/60から60/60になるまで更新されていきます！かっこいい!
<img width="1017" alt="スクリーンショット 2019-11-28 23.03.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438597/71d29858-4b0f-5799-1671-fda7fcba66f1.png">
これは何が起こっているのかというと、実際にニューラルネットワークで学習が行われていく要素を可視化してくれているんですね（なので、非表示にすることも可能です）。
動画で掲載できなくて残念ですが、AIっぽくてとてもテンションが上がる光景です。
コードをコピペするだけで簡単に実行できるので、是非ご自分の目で確かめてください。

### 訓練済みモデルでファッション画像を予測

前節を経て、今の我々は訓練済みのモデルを持っています。
早速使ってみましょう!

```python
LABEL_NAMES = ['t_shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt', 'sneaker', 'bag', 'ankle_boots']


cpu_model = create_model()
cpu_model.load_weights('./fashion_mnist.h5')


def plot_predictions(images, predictions):
  n = images.shape[0]
  nc = int(np.ceil(n / 4))
  f, axes = pyplot.subplots(nc, 4)
  for i in range(nc * 4):
    y = i // 4
    x = i % 4
    axes[x, y].axis('off')
    
    label = LABEL_NAMES[np.argmax(predictions[i])]
    confidence = np.max(predictions[i])
    if i > n:
      continue
    axes[x, y].imshow(images[i])
    axes[x, y].text(0.5, 0.5, label + '\n%.3f' % confidence, fontsize=14)

  pyplot.gcf().set_size_inches(8, 8)  

plot_predictions(np.squeeze(x_test[:16]), 
                 cpu_model.predict(x_test[:16]))
```

すると、下記のような結果が出力されます。
<img width="548" alt="スクリーンショット 2019-11-28 23.10.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438597/60d1ea51-0e3f-728a-820d-da65ed3f700f.png">
10種類の服のジャンルを予測、分類することができました！しかもなかなか高精度ですね。

## 終わりに
お疲れ様でした。そしておめでとうございます！
これであなたは「機械学習のモデルを実装したことがある」と言う資格があります。
実はコード自体は短いし、実行するだけなら難しくないんですね。
「機械学習のプログラミングってこんな感じか〜」となんとなく感じて頂けたでしょうか。

最後に、今回の記事の概要を復習しましょう。
・機械学習の勉強はまずモデルを構築してみるのがおすすめ
・モデル構築だけなら機械学習は超簡単
・15分間でkerasで画像認識をしてみよう(必要なのはChromeが開けるPCのみ)

次は是非、機械学習の仕組みやPythonのコードについて理解することにチャレンジしてみてください。

## 参考文献

[Fashion MNIST with Keras and TPUs-SeedBank](https://research.google.com/seedbank/seed/fashion_mnist_with_keras_and_tpus)
本記事のコードは「SeedBank」より引用させて頂いています。

[Colaboratory へようこそ](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

[Distutilsの紹介-Python3.8.0ドキュメント](https://docs.python.org/ja/3/distutils/introduction.html)

## 参考

[人工知能特化型プログラミング学習サービスAidemy Premium Plan](//af.moshimo.com/af/c/click?a_id=2279296&p_id=1386&pc_id=2364&pl_id=20670&guid=ON)【Aidemy】

[自走できるAI人材になるための6ヶ月長期コース](https://px.a8.net/svt/ejp?a8mat=3NL3I3+2MNXYQ+4J9I+BWVTE)【キカガク】

[現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F)【Udemy】

[Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）
](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-web-scraping-with-beautifulsoup-selenium-requests%2F)【Udemy】

[【世界で18万人が受講】実践 Python データサイエンス](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-jp%2F)【Udemy】

[【画像判定AIアプリ開発・パート1】TensorFlow・Python・Flaskで作る画像判定AIアプリ開発入門](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Ftensorflow-advanced%2F)【Udemy】

[【キカガク流】プログラミング力向上のためのPythonで学ぶアルゴリズム論（前編）
](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Falgorithm1%2F)【Udemy】

[Python 1年生 体験してわかる！会話でまなべる！プログラミングのしくみ ](https://amzn.to/3rVIkb6)
[Python2年生 スクレイピングのしくみ 体験してわかる！会話でまなべる！](https://amzn.to/3hFkSKs)

[入門 Python 3](https://amzn.to/2XbQeiw)
[独学プログラマー Python言語の基本から仕事のやり方まで](https://amzn.to/2XhElY1)

[人工知能プログラミングのための数学がわかる本](https://amzn.to/38damqt)
[[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践](https://amzn.to/3rX83Qc)

[Kaggleで勝つデータ分析の技術 ](https://amzn.to/3pPKvLr)
[スクレイピング・ハッキング・ラボ　Pythonで自動化する未来型生活](https://amzn.to/2LjkdlJ)

<a href="https://www.amazon.co.jp/dp/4798153192/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=d0b06254c024b8a7229ef25ef2fe6d9f&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4798153192&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4798153192" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/Python2%E5%B9%B4%E7%94%9F-%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E4%BD%93%E9%A8%93%E3%81%97%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81%E4%BC%9A%E8%A9%B1%E3%81%A7%E3%81%BE%E3%81%AA%E3%81%B9%E3%82%8B%EF%BC%81-%E6%A3%AE-%E5%B7%A7%E5%B0%9A/dp/4798161918/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0&qid=1609820034&sr=8-2&linkCode=li2&tag=fden02-22&linkId=5f402765bd7550a2b08eaf1cbb51d5e4&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4798161918&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4798161918" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a href="https://www.amazon.co.jp/dp/4873117380/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=a48091637d5aca399e2a19ec7b646234&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873117380&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4873117380" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/dp/4822292274/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=e1b20b2dccfab4db40563da5472a095f&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4822292274&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4822292274" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


<a href="https://www.amazon.co.jp/dp/4046021969/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=cc5ecdf0f8645221e4946f94bb6fc5f8&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4046021969&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4046021969" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/dp/4295003379/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=fac9bf3045de0d26a413aa1715019af1&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4295003379&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4295003379" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

<a href="https://www.amazon.co.jp/dp/4297108437/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=353e70ac935e4ca56bb565645832f3d2&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4297108437&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4297108437" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%A9%E3%83%9C-Python%E3%81%A7%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%9C%AA%E6%9D%A5%E5%9E%8B%E7%94%9F%E6%B4%BB-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E9%BD%8A%E8%97%A4-%E8%B2%B4%E7%BE%A9-ebook/dp/B08H1KBYG2/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0&qid=1609820034&sr=8-1&linkCode=li2&tag=fden02-22&linkId=61c57e05decd0916bf22ee9841dbfe1f&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08H1KBYG2&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B08H1KBYG2" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />