深層学習で画像分類を試す(TensorFlow Keras MNIST)

PythonをPysonと書いて凄腕エンジニアが苦笑い。
ビジネスイノベーションセンター川崎です。

目次

  1. はじめに
  2. MNISTを使って深層学習を体験しよう
    -実行環境
    -MNISTとは
    -Anacondaのインストール
    -TensorFlow+Kerasのインストール
    -Jupyter Notebookを起動
    -動作確認
    -結果解説
    -まとめ
  3. 用語解説
    -機械学習と深層学習の関係
    -ニューラルネットワークとは
    -「mnist_cnn.py」は何をしていたのか
  4. おわりに

1.はじめに

本記事では、Pythonなど読んだ事もない私が、深層学習にHelloWorldした事を記します。ゴールは、とりあえず動かし調べ概要を掴むことです。

この記事の動作確認手順は1時間もあれば終わります。待ち時間を除けばせいぜい30分です。

あなたがお持ちのそのWindows搭載パソコンでもすぐにできるのでお試し下さい。

 

少し経緯を記します。

クレスコは、今日も元気よく人工知能(AI)関連ビジネスの拡大に向け邁進しています。
私は、「とりあえず何かを動かして、AIを語れるようになりたい」と思い立ちました。

しかしながら、私1人の力では作業に取り掛かれません。
そこで私は、クレスコが誇る最先端技術の源泉「技術研究所」を訪ねる事にしました。
本社25Fには食器洗い乾燥機ほどに巨大なPCがあります。
巨大PCの傍らで日々謎の英字を打ち続ける者の名は910。深層学習による眼疾患判定エンジンの開発を皮切りに医療分野で数々の功績をあげているチームに在籍する凄腕エンジニアの一人です。

「TensorFlowでとりあえず何か動かしたいんだけど、ご教授頂けませんか?」
「はい。動かすだけなら簡単ですよ。まぁニューラルネットの概念が少しわかっていれば問題ないと思いますよ。」
「ニュー、ラル、ネット・・・。」
「・・・これは大問題ですね。」
「では、カロリーメイトを1箱あげますのでどうかお願いします。」
「はい。頑張りましょう。」
本記事では、カロリーメイト1箱と引き換えに獲得したノウハウを披露したいと思います。

本題に移る前の前置きですが、広大なWEBの世界には同様の記事が無数にあります。
そんな折、私にできる事、私が伝えたい事は、以下の2点です。
①最低限の手順でとりあえず動かす
②最低限の解説でなんとなく理解した気になる

2.MNISTを使って深層学習を体験しよう

「学ぶ前でもまずやってみる」それが私の考えです。さっそく動かします。

実行環境

OS : Windows10 Pro (64bit)
CPU : Core i5-6200U 2.30GHz 2.40GHz
RAM:4G

Python 3.6.5(Anaconda3 5.2.0-64bit)
tensorflow 1.7.0
Keras 2.1.4

MNISTとは

MNISTは、0-9の数字が書かれた70000枚の画像に正解ラベルが与えられているデータセットです。

こんな画像です。

今回は最も初歩的な以下の処理を試してみます。
「1」の画像を入力すると「1の確率が〇〇%です」と出力させるための学習データを作成します。
具体的には、60000枚の画像に対して謎の処理をゴリゴリ回すことで学習データを作成し、10000枚の画像で結果をテストします。
この謎の処理をグレードアップさせていけば、カロリーメイトの画像を入力すると「カロリーメイトです」と判断できる学習データも作成できるでしょう。

ではさっそく環境構築を始めます。

Anacondaのインストール

Anacondaは、Pythonと便利なツールがセットになったディストリビューションです。
Anaconda for Windows の「Python3.6 Version」を、こちらからダウンロードします。
メールアドレスを聞かれる画面が出ますが×閉じしても問題なくダウンロードできます。
ダウンロードしたファイルをダブルクリックしてインストールを進めます。
選択項目は、5画面目くらいの「Advanced Installation Options」画面-「Add Anaconda to my PATH environment variable」にはチェックを入れましょう。それ以外はデフォルトで構いません。
Anacondaのインストール完了後に、MicrosoftVisualStudioCodeのインストールを勧められますが入れなくてもよいです。私はskipしました。

TensorFlow+Kerasのインストール

TensorFlowとKerasは、深層学習用ライブラリです。数学的理論の部分を意識せずにコードが書けるようになります。

Windows標準のコマンドプロンプトを管理者権限で開き以下のコマンドを入力します。

TensorFlow(CPU版)インストール

pip install tensorflow

Kerasインストール

pip install keras

Jupyter Notebookを起動

Anacondaに付属しているJupyter Notebookを使えばWebブラウザ上で簡単にPythonコードを実行できます。
「スタートメニュー」-「Anaconda3 (64bit)」-「 Jupyter Notebook 」を開きます。
「New」-「Python3」を選択します。

In [ ] のところに任意のコードを書いて「Run」を押せば実行できます。
試しに「1+1」と書き「Run」を押してみましょう。「2」と出力されるはずです。

これで準備が整いました。満を持して動かしましょう。

動作確認

サンプルコード「mnist_cnn.py」を実行します。
GitHub上のこちらにアクセスして、コードを全行コピーします。

 

コピーしたコードをIn [ ]の部分に張り付けます。

 

10行目の「epoch=12」を「epoch=2」に変更します。
(epochは学習回数です。変更しなくてもいいですが12だとかなり時間がかかるので、まずは任意の少なめの数字にすることをお勧めします。)

 

※次の手順で「Run」を押すと非常に重い処理が走ります。CPU使用率は100%に張り付くでしょう。

「Run」をクリックします。

動き出しましたか?

「xxxx/60000」の数字が増えていくと思いますので処理が終わるまで待ちましょう。
私のPCの場合は10分以内に終わりました。
この際、「acc: xxxx」が徐々に増えていきます。これは学習が進むにつれて精度が徐々に上がっていることを意味します。

 

結果の解説

x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples

60000枚のサンプルで学習データを作り、10000枚のサンプルでテストするよ。

Epoch 1/2
60000/60000 [==============================] – 169s 3ms/step – loss: 0.2564 – acc: 0.9211 – val_loss: >0.0555 – val_acc: 0.9818
Epoch 2/2
60000/60000 [==============================] – 169s 3ms/step – loss: 0.0856 –
acc: 0.9749 – val_loss: 0.0405 – val_acc: 0.9871
Test loss: 0.04046422747756005
Test accuracy: 0.9871

「Test accuracy: 0.9871」は、最終的な正答率です。
つまり、98.71%の確率で正解することができる学習データが完成したという事です。

「Epoch 1/2」は、2回学習するうちの1回目を示します。
「acc」「val_acc」はそれぞれ、学習用データ(60000枚のサンプル)、検証用データ(10000枚のサンプル)での「正答率」を示します。
「loss」「val_loss」は、学習用データ、検証用データでの「損失率」を示します。
1回目に比べて2回目は「loss」が小さくなっていますから、学習の効果があることがわかります。

今回は2回しか学習していませんからあまり関係ありませんが、学習を続けていくとあるタイミングで「loss」が横ばいになるはずです。そこが学習の止め時です。さらには、いわゆる「過学習」を起こし「loss」が逆に増加してしまう場合があります。この過学習を起こさないようにするテクニックは色々とあるようで、今回実行したコードでは、「DropOut」関数を用いて過学習を起こさないようにしています。

まとめ

以上でMNISTを用いた画像分類の動作確認は完了です。これであなたも「深層学習やったことあります」の称号を得ました。
思ったよりもすぐに終わったのではないでしょうか。カップラーメンにお湯を入れてから手順を開始したとしても、伸びた麺に目を瞑りさえすればまだまだ食べられる状態です。今回とりあえず動かしたことで知識が入ってきやすくなったことでしょう。

3.用語解説

では、最後に無い知恵を絞って調べた用語解説は記します。明らかに説明不足ですが、なんとなくわかった気になれる情報を目指します。

いま思いついた名言「情報は少ないほど美しい」を言い訳にしますが、誤りがあればご指摘いただけますと幸いです。

機械学習と深層学習の関係

「機械学習(Machine Learning)」 ⊃ 「深層学習(Deep Learning)」

つまり、「食料」 ⊃ 「カロリーメイト」の関係性です。

深層学習は、多層構造ニューラルネットワークを用いた機械学習です。

ニューラルネットワークとは

人間の脳は、神経細胞(ニューロン)が成す巨大なネットワークです。

私たちが物事を記憶し思い出しおしゃべりできるのは、シナプスの結合強度を基に情報と情報の繋がり方を判断できるためだと考えられています。

ニューラルネットワークとは、こういった脳の仕組み(ニューロンが成す神経回路)を人工ニューロンと呼ばれる数理モデルで表現したものです。

シナプスの結合強度を、人工ニューロンでは「重み(W)」で表現します。

「ニューラルネットワーク」には様々な手法がありますが、今回挑戦したMNISTを用いた画像分類は、 畳み込みニューラルネットワーク(CNN)を用いています。

CNN(Convolutional Neural Network)は、画像認識関連でよく使われます。例えば、Facebookのタグ付けシステムDeepfaceで使用されている事で有名です。

「mnist_cnn.py」は何をしていたのか

今回は「mnist_cnn.py」を実行しました。

機械学習は行列の計算です。

入力となる手書き数字の画像を1ピクセル毎(28ピクセル×28ピクセル=784要素)に分割し、行列として表わします。

出力となる0-9も行列で表します。例えば「3」は [0,0,0,1,0,0,0,0,0,0] です。

これが「機械学習は数学が重要」の所以の一つです。

こんな具合に数学の話がたくさん出て来ます。1番必要なのは線形代数で、次点は微積分といったところでしょうか。

さて、(私が説明できる狭い範囲の)キーワードは以下の3点です。

・重み

・活性化関数(今回はSoftmax関数)

・バイアス

「学習」とは、正解を導くための「重み」を最適化することです。

入力(画像を行列化したもの)に対してSoftmax関数等の活性化関数を通して出力を確率分布にします。例えば、1の確率80%、7の確率10%、その他10%という具合です。

そして、上記の出力(予測)と正解を突合します。

この処理を60000回繰り返す事で、正解率の高い最適な「重み」を導くのです。

ちなみに「バイアス」は入力に結びついていない重みの事です。極端ですが例えば、画像の特性上「1」の誤認率が高いので「1」の確率を一律10パーセント減らす、などです。今回の処理ではバイアスを最適化する学習は含まれません。

4.おわりに

深層学習にHelloWorldした話は以上です。

最初は何もわかりませんでしたが、やはり実際に動かしてみるとイメージが湧くものです。大変良い経験でした。ご協力いただきました技術研究所の皆様、ありがとうございました。

 

  • このエントリーをはてなブックマークに追加