TensorFlow(テンソルフロー)のインストールは成功しましたか?
Hello Worldを表示できても、全然機械学習じゃないよね…と思っていませんか?
今回は、WindowsでTensorFlowを使って手書き数字を学習し、自分で書いた手書き数字の認識に挑戦してみます。
画面を紹介しながら操作を説明しますので、TensorFlowをどうやって使うのかがよく分かると思います。
肝心の手書き数字の認識については、結論から言うと、私が書いた数字は50%(4個中2個)の確率で認識できました。
ぜひ、この記事のとおりに操作して、あなたが書いた数字を認識できるか試してみてください!
TensorFlowとは?
TensorFlowは、機械学習や深層学習のプログラムを実装する際に使用できるライブラリです。
TensorFlowとは何か?については、以下の記事で説明していますので、よく分からない方は確認してみてくださいね。
TensorFlowを始める前に
TensorFlowを始める前に、必要な知識とソフトウェアを確認しておきましょう。
必要な知識は、
- 機械学習や深層学習の分野の知識
- Pythonの知識
- NumPyなどのライブラリの知識
必要なソフトウェアは、
- Python
- TensorFlow
- その他のライブラリ
です。
それから、TensorFlowを始める前に「機械学習の対象とする大量のデータ」が必要であることも忘れてはいけません。
ちなみに、TensorFlowには、TensorFlow for Javaや、TensorFlow for Cのようなライブラリもありますが、これらはPythonのTensorFlowで学習したモデルを利用するためのライブラリです。
TensorFlowのインストール
TensorFlowは非常に新しいライブラリで、頻繁に更新されています。
TensorFlow 1.0:2017年2月
TensorFlow 1.1:2017年4月
TensorFlow 1.2:2017年6月
TensorFlow 1.3:2017年8月
TensorFlow 1.4:2017年11月
TensorFlow 1.5:2018年1月
バージョンによって、インストール手順が変わる場合がありますので、注意が必要です。
2018年1月にリリースされたTensorFlow 1.5をWindows 10にインストールする手順は、以下の記事で説明しています。
GPU版TensorFlowのインストール方法も説明していますので、ぜひご覧ください。
この記事では、上の記事に従ってGPU版TensorFlowをインストールした環境の操作を説明します。
この記事の内容はCPU版TensorFlowでも問題なく動作しますが、GPU版TensorFlowであれば約1.5秒で終わる処理が、CPU版TensorFlowでは約30秒かかりましたので、GPU版TensorFlowを超オススメします!
手書き数字の認識に挑戦!
お待たせしました。
TensorFlowで機械学習といえば、手書き数字の認識プログラムが有名です。
ここからはTensorFlowを使って、手書き数字の認識に挑戦していきましょう。
「手書き数字の認識プログラム」とは、以下のような画像を読み込むと、「3」が返ってくるプログラムです。
この記事では、手書き数字の認識プログラム(cnn_mnist.py)をダウンロードして、手元のPCに機械学習をさせて、上の画像を読み込ませて「3」と表示させてみます。
cnn_mnist.pyをダウンロードする
TensorFlowのサイトに、「A Guide to TF Layers: Building a Convolutional Neural Network」(TensorFlowレイヤーガイド:畳み込みニューラルネットワークの構築)というページがあります。
参考:https://www.tensorflow.org/tutorials/layers
上のページでは、詳細な解説を交えつつ、手書き数字の認識プログラムを作成しています。
この記事では、詳細な解説は上のページにお任せして、解説されているプログラムを試してみることにします。
まずは、以下のページから、cnn_mnist.pyをダウンロードしてください。
参考:https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/examples/tutorials/layers/cnn_mnist.py
手書き数字を学習する
ダウンロードしたcnn_mnist.pyは、Pythonのプログラムです。
機械学習を実行するには、Pythonのプログラムの他に、大量の手書き数字のデータが必要であることは、すでに説明したとおりです。
それでは、機械学習に必要な大量のデータはどこからダウンロードすればいいのでしょうか?
実は、cnn_mnist.pyの以下の部分で、機械学習に必要な大量のデータをダウンロードする仕組みになっているのです。
mnist = tf.contrib.learn.datasets.load_dataset("mnist")
さて、プログラムの準備ができて、データのダウンロードにも目処が立ったところで、TensorFlowをインストールした環境で機械学習を実行してみましょう。
ここでは、Anaconda NavigatorからGPU版TensorFlowをインストールしたPython環境を起動して、「D:\TensorFlow」フォルダに保存したcnn_mnist.pyを実行する操作を説明します。
(1)Anaconda Navigatorを起動します。
(2)「Environment」をクリック後、「tensorflow-gpu」をクリックし、「▶」をクリックして、「Open Terminal」をクリックします。
(3)「D:」と入力し、Enterキーを押します。
(4)「cd TensorFlow」と入力し、Enterキーを押します。
(5)「python cnn_mnist.py」と入力し、Enterキーを押します。
このプログラムでは、手書き数字を認識させる際に必要なデータとして、MNISTと呼ばれるデータセットを利用しています。
初めて実行するときは、MNISTをダウンロードするので少し余計に時間がかかります。
実行中は以下のような画面が表示されます。
「step = 4801」の部分が、20000になると終了ですので、終了するまで待ちます。
※2回目の実行では、20000から始まり40000になると終了します。これをリセットするには、「D:/tmp/mnist_convnet_model」フォルダを削除します。
終了すると、以下のように表示されます。
accuracy(正確さ)に「0.97」と表示されていますので、テストデータのうちの97%を正確に認識できたことがわかります。
ペイントで手書き数字を準備する
ここまで読んでいただきましたが、残念ながら実感が湧きませんね。
そこで、ここからは、実際に手書き数字を書いてみて、正しく認識できるか(PCが理解できる数字を書けるか)を確認してみましょう。
まずは、Windows標準のペイントで手書き数字を作成しましょう。
(1)ペイントを起動します。
用意する画像は、縦28ピクセル×横28ピクセルにする必要があります。
この大きさでは、小さすぎて数字を書くのは難しいので、大きい画像に数字を書いてから縮小します。
(2)「サイズ変更」をクリックします。
(3)「ピクセル」を選択し、「縦横比を維持する」のチェックを外して、「水平方向」と「垂直方向」に「280」と入力し、「OK」をクリックします。
(4)「ブラシ」をクリックし、「クレヨン」をクリックします。
手書きと言えば、クレヨンだと思いましたが、ほかのブラシでも挑戦してみてくださいね。
(5)白いキャンバスをドラッグすると線が書けますので、「8」を書き、「サイズ変更」をクリックします。
(6)「ピクセル」を選択し、「水平方向」に「28」と入力し、「OK」をクリックします。
(7)「」をクリックし、「ハチ.png」として保存します。
同様に、(ニ.png)、(サン.png)、(ヨン.png)も作ってみました。
手書き数字を認識してみる
それでは自分で書いた手書き数字を認識してみましょう!
cnn_mnist.pyを書き替える
手書き数字を認識するには、cnn_mnist.pyを少し書き替える必要があります。
具体的には、以下の2行を、
if __name__ == "__main__": tf.app.run()
次のように書き替えます。
def checkImage(arg): new_img = Image.open(arg) new_img = new_img.convert('L') new_img = 1.0 - np.asarray(new_img, dtype="float32") / 255 predict_data = new_img.reshape((1,784)) # Create the Estimator mnist_classifier = tf.estimator.Estimator( model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_model") predict_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": predict_data}, num_epochs=1, shuffle=False) predict = mnist_classifier.predict( input_fn=predict_input_fn ) predictions = list(predict) print("CLASS:") print(predictions[0]["classes"]) if __name__ == "__main__": import sys if len(sys.argv) == 1: tf.app.run() else: import os from PIL import Image for arg in sys.argv[1:]: if os.path.isfile(arg): checkImage(arg)
Pillow(Python Imaging Library)をインストールする
書き替えたcnn_mnist.pyを実行する前に、コマンドプロンプトで次のように入力して、Pillow(Python Imaging Library)をインストールしておきましょう。
pip install pillow
手書き文字を認識する
まずは(二.png)から認識してみましょう。
コマンドプロンプトで次のように入力します。
python cnn_mnist.py ニ.png
実行結果の最後に、以下のように認識結果が表示されます。
CLASS: 2
このように「2」と表示されれば、認識成功です。
同様の手順で他の画像も試してみました。
(サン.png):成功
(ヨン.png):「6」と誤読
(ハチ.png):「3」と誤読
簡単なようで、なかなか難しいですね。
まとめ
今回は、TensorFlowでMNISTを使って手書き文字を学習し、自分で書いた手書き文字を認識してみました。
乱数が使われているため学習のたびに結果は変わりますし、学習回数を変えても結果は変わります。
認識精度を上げるために、何が必要なのかは、機械学習の理論を学び、様々な試行錯誤を繰り返して習得していくと良いでしょう。
がんばりましょう!