Colaboratory 上で Tensorflow 2 を使い、自分の手書き数字のラベルを予測する。


最終的なノートブック

Colaboratory 上でノートブックを作る

Colaboratory 上で、

  • ファイル > Python 3 の新しいノートブック

から新しいノートブックを作ります。

  • 編集 > ノートブックの設定

を選択すると次のようなポップアップが表示されるので、ハードウェア アクセラレート のドロップダウンメニューから GPU を選びましょう。

手書き文字画像のラベルを予測するモデルを学習する

次のチュートリアルを実行していきます。

Tensorflow のバージョン設定

!pip list | grep tensorflow

上記を実行すると、バージョンが 1.15.0 であることがわかります。

!pip install -U tensorflow

上記を実行すると次のようなエラーが出ますが、今回の範囲内では問題ありませんでした。

もう一度 pip list でバージョンを確認しておきましょう。

モデルを学習させる

ひたすら、チュートリアルのコードをコピペして、実行していきます。。。
5 epoch 回るのに、数分かかりましたが、問題なく終了しました。

MNIST データセットの入力がどんなものか表示してみる

ノートブック上で画像を表示する方法はいくつかありますが、今回は PIL を使います。

from PIL import Image

img = Image.fromarray(x_test[0].reshape((28,28)) * 255).convert("RGB")
img

次のように画像が 7 の画像が表示されました。

自分の手書き数字の画像のラベル予測してみる

鉛筆だと線が細すぎてうまくいかなかったので、マジックペンで上書きした次のような画像を用意しました。

左のペインを開くと、 ファイル というタブがあるので、選択すると今のワーキングディレクトリのファイルが表示されます。
アップロード というボタンがあるので、そこから自分の手書き画像をアップロードします。

MNISTの入力との違いは、

  • サイズが大きいこと
  • 白黒画像じゃないこと
  • 背景の方が明度が高いこと

なので、次のコードでMNISTの画像に合わせます。

from PIL import ImageOps

my_img = ImageOps.invert(Image.open("my_input.jpg").resize((28, 28)).convert("L"))
my_img

値を0~1に変換し、チャンネルの次元を加えて、先ほど学習したモデルに入力すると、
出力は次のようになりました。

import numpy as np

my_input = (np.array(my_img) / 255).reshape((28,28,1))
my_output = model([my_input]).numpy()[0]
my_output

次のコードで何番目のラベルの確率が一番高いか確認します。

my_output.argmax()

うまく予測できていることが確認できました。