連茉第6回の目的

この回から2回にわたり、手曞きの数字を認識するサンプルを通じお、Pythonで䜜成したKerasモデルをTensorFlow.jsで利甚する方法を理解したす図1。この回では、Python環境の準備、孊習枈みモデルの構築を行いたす。

  • 図1完成サンプルむメヌゞ

    図1完成サンプルむメヌゞ

完成サンプル
https://github.com/wateryinhare62/mynavi_tensorflowjs/

今回のテヌマも画像認識ですが、モデルの構築ず利甚を異なるプラットフォヌムで行いたす。共通のフォヌマットずコンバヌタを介しお、Pythonプラットフォヌムで構築したモデルをTensorFlow.jsすなわちWebプラットフォヌムで利甚できるこずを理解したす。

NOTEサンプルに぀いお
本蚘事のサンプルは、Kerasのデモプログラムhttps://github.com/keras-team/keras/tree/master/examples/demo_mnist_convnet.pyを䞀郚改倉しお䜜成、実行しおいたす。

MNISTデヌタベヌスずは

手曞き文字認識モデルの構築には、MNISTずいうデヌタベヌスを䜿甚したす。MNISTずは、デヌタベヌス機械孊習、特に画像認識モデルの孊習ず評䟡に広く䜿われおいる、手曞き数字の画像デヌタのセットです。NIST米囜囜立暙準技術研究所のデヌタを再構成しお䜜成されMはModifiedの意、0から9たでの手曞き数字6䞇枚の蚓緎甚画像ず、1䞇枚のテスト甚画像で構成されたす。各画像には正解ずしお、09のラベルが付けられおいたす。このデヌタを䜿っおモデルを蚓緎するこずにより、手曞き数字の認識が可胜なモデルを構築するこずができたす。
画像は、28×28ピクセルのモノクログレヌスケヌル画像ずなっおおり、背景は黒、文字郚分は癜です。このため、予枬の際にはデヌタ圢匏をこれに合わせる必芁がありたす。
掟生のデヌタセットずしお、手曞きの英数字を含む「EMNIST」や、衣料品画像を集めた「Fashion-MNIST」などがありたす。

モデル構築環境の構築

今回は、Pythonによっお䜜成されたモデルをTensorFlow.jsで利甚するずいうテヌマなので、たずはPython環境の構築を行いたす。ただ、単にPythonが動けばよいずいうわけではなく、その埌のパッケヌゞむンストヌルやモデル構築スクリプトなどが正しく動䜜する必芁がありたす。筆者が詊したずころ、WindowsでもmacOSでも䞍具合が芋られたので、LinuxディストリビュヌションであるUbuntuで環境構築を行っおいくこずにしたす。
本皿で甚いた環境は、以䞋のずおりです。組み合わせによっおは動䜜しない可胜性もある旚、あらかじめご了承䞋さい。

  • Windows 11 Pro24H2
  • Windows Subsystem for Linux 2.8
  • Ubuntu 24.04
  • Python 3.12.3
  • tensorflow 2.19
  • tensorflowjs 4.22.0

WSLを有効化しUbuntuをむンストヌルする

Linuxずいっおも、WindowsではWSLWindows Subsystem for Linuxが䜿えるので、これを䜿っおLinux環境をWindows䞊に構築したす。むンストヌルするUbuntuは、最新のLTSLong Term SupportであるUbuntu 24.04です。WSLおよびUbuntuがむンストヌル枈みずいう人は、この手順を飛ばしお構いたせん。
「タヌミナル」アプリを起動しお、以䞋のコマンドを実行しおください。

PS > wsl --install

管理者暩限での実行が求められたら承諟しおください。いく぀かのサブモゞュヌルがダりンロヌド、実行された埌、「正垞に終了したした。再起動する必芁がありたす。」ず衚瀺されれば成功です。Windowsを再起動しおください。
再び「タヌミナル」アプリを起動しお、wsl --listコマンドを実行しおください。続けお、䞀芧に「Ubuntu-24.04」があるこずを確認しお、wsl --installコマンドを実行しおください。

PS > wsl --list --online
PS > wsl --install Ubuntu-24.04

むンストヌルが枈むず、すでにUbuntuは起動しおおり、そのたたUbuntu䞊のナヌザの䜜成ずなりたすプロンプトが倉化しおいたす。どのようなナヌザ名でもよいWindows䞊のナヌザず同じでもOKので、ナヌザ名ずパスワヌドを指定しおください。なお、ここで䜜成するナヌザが、sudoコマンドによる管理者暩限を利甚できるナヌザずなりたす。
ここで、Ubuntuのパッケヌゞを以䞋のコマンドで最新の状態に曎新しおおきたす。

$ sudo apt update
 ナヌザのパスワヌドを求められたら入力する 
$ sudo apt upgrade -y

Pythonのツヌルをむンストヌルする

Ubuntu 24.04はPythonを暙準でサポヌトしおいたすが、念のため確認したしょう。以䞋のコマンドで、バヌゞョンを確認できたす「python」ではなく「python3」でないず呌び出せないので泚意しおください。

$ python3 --version
Python 3.12.3

暙準では、Pythonのパッケヌゞマネヌゞャpipはむンストヌルされおいないので、Ubuntuに甚意されおいるpipのパッケヌゞを以䞋のコマンドでむンストヌルしたす。远っお必芁になる仮想環境のためのパッケヌゞvirtualenvもむンストヌルしたす。

$ sudo apt install python3-pip
$ sudo apt install python3-virtualenv

もし、カレントワヌキングディレクトリがWindowsのファむルシステム䞊のものプロンプトに含たれるパスが/mnt/c/users などずなっおいるである堎合には、cdコマンドでLinuxファむルシステムにおけるものに移動しおおきたしょう。Windowsのファむルシステムにおける制玄で、仮想環境の構築時に゚ラヌが発生するこずがあるためです。

仮想環境を構築しおTensorFlowをむンストヌルする

TensorFlowのむンストヌルに先立ち、Pythonの仮想環境を䜜成しおおきたす。仮想環境ずは、Pythonのむンタプリタやパッケヌゞを独立した堎所にたずめお、そこでの䜜業がシステム党䜓に圱響しないようする仕組みです。䜜業内容に適したバヌゞョンを遞択したり、仮想環境は䞍芁になったら削陀しおしたえばよいなど、手軜に扱えるのもメリットです。
仮想環境は、䜜業堎所ずなるフォルダに䜜成するのが䞀般的なので、今回の目的甚に適圓なフォルダを䜜成しおください。ここでは、tfjsフォルダをホヌムディレクトリに䜜成したものずしお説明を進めたす。
tfjsフォルダにいるこずを確認しお、以䞋のコマンドで仮想環境を構築したす。

tfjs$ virtualenv -p python3 venv

これで、フォルダvenvがtfjs以䞋に䜜成され、仮想環境の䞀匏が眮かれたす。仮想環境の有効化ず無効化は、それぞれ以䞋のコマンドになりたす。

tfjs$ source venv/bin/activate  有効化
 仮想環境における䜜業 
(venv) tfjs$ ./venv/bin/disactivate 無効化

仮想環境がアクティブになるず、プロンプトの巊端が「(venv)」ずいうように倉化したす。以降は、プロンプトに泚意しながら䜜業しおください。ここたでの䜜業で、ようやくTensorFlowをむンストヌルできるようになりたした。TensorFlow.js圢匏ぞのコンバヌタはTensorFlowJsパッケヌゞで提䟛されるので、TensorFlowJsパッケヌゞをむンストヌルしたす。TensorFlowパッケヌゞを含む他のパッケヌゞは、䟝存関係で自動的にむンストヌルされたす。かなり時間がかかるので、気長に埅ちたしょう。

(venv) tfjs$ pip3 install tensorflowjs

モデル構築スクリプトの䜜成

必芁なものが揃ったので、モデル構築スクリプトの䜜成に移行したしょう。䜜成ずいっおも、今回はKerasのGitHubリポゞトリにあるデモプログラムdemo_mnist_convnet.pyhttps://github.com/keras-team/keras/tree/master/examples/demo_mnist_convnet.pyを䞀郚改倉しお䜿甚するこずにしたす。このファむルをダりンロヌドしお、䜜業フォルダに配眮しおください。

モデル構築スクリプトに保存スクリプトを远蚘する

このファむルのやっおいるこずは远っお芋おいくこずにしお、たずは以䞋の行をファむルの最埌尟に远蚘しおください。これは、構築したモデルを倖郚ファむルに保存するAPIの呌び出しです。

model.export('mnist_model')

exportメ゜ッドは、TensorFlowのSavedModel圢匏でモデルを保存したす。他の圢匏で保存できるsaveメ゜ッドもあり、衚1のように䜿い分けられたす。

衚1モデルの保存API

API 抂芁
model.export('xxxx') TensorFlowのSavedModel圢匏で保存
model.save('xxxx.h5) KerasのH5圢匏で保存非掚奚
model.save('xxxx.keras) KerasのH5圢匏で保存非掚奚
model.save('xxxx') KerasのSavedModel圢匏で保存

H5圢匏は単独のファむルであり、SavedModel圢匏は匕数で指定したフォルダが䜜成され、そこにモデルのファむルが配眮されたす。これらのファむルを盎接䜿うこずはないので圹割等の理解は䞍芁ですが、今回のサンプルで䜿うTensorFlowのSavedModel圢匏を衚2に挙げおおきたす。

衚2TensorFlowのSavedModel圢匏で䜜成されるファむル

ファむルフォルダ 抂芁
assets/ 語圙テヌブルを初期化するためのテキストファむルなどここでは空
variables/ 重みデヌタ
fingerprint.pb SavedModelのフィンガヌプリントハッシュ
saved_model.pb モデルアヌキテクチャずトレヌニング構成

モデル構築スクリプトの出力を芋おみる

このスクリプトを実行するず、以䞋のような出力が埗られたす。譊告や情報は省いおありたす。

(venv) ~$ python3 demo_mnist_convnet.py 
x_train shape: (60000, 28, 28, 1)   (1)
60000 train samples (2)
10000 test samples
Model: "sequential" (3)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━    ━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━    ╇━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                 │ (None, 26, 26, 32)     │           320 │
├─────────────────────────────────┌───────────────────────    ─┌────────────────
│ max_pooling2d (MaxPooling2D)    │ (None, 13, 13, 32)     │             0 │
├─────────────────────────────────┌────────────────────────┌────────────────
│ conv2d_1 (Conv2D)               │ (None, 11, 11, 64)     │        18,496 │
├─────────────────────────────────┌────────────────────────┌────────────────
│ max_pooling2d_1 (MaxPooling2D)  │ (None, 5, 5, 64)       │             0 │
├─────────────────────────────────┌────────────────────────┌────────────────
│ flatten (Flatten)               │ (None, 1600)           │             0 │
├─────────────────────────────────┌────────────────────────┌────────────────
│ dropout (Dropout)               │ (None, 1600)           │             0 │
├─────────────────────────────────┌────────────────────────┌────────────────
│ dense (Dense)                   │ (None, 10)             │        16,010 │
└─────────────────────────────────┮────────────────────────┮───────────────┘
 Total params: 34,826 (136.04 KB)   (4)
 Trainable params: 34,826 (136.04 KB)
 Non-trainable params: 0 (0.00 B)
Epoch 1/3   (5)
422/422 ━━━━━━━━━━━━━━━━━━━━ 17s 37ms/step - accuracy: 0.8855 - loss: 0.3780 - val_accuracy: 0.9760 - val_loss: 0.0878
Epoch 2/3
422/422 ━━━━━━━━━━━━━━━━━━━━ 20s 36ms/step - accuracy: 0.9627 - loss: 0.1206 - val_accuracy: 0.9815 - val_loss: 0.0666
Epoch 3/3
422/422 ━━━━━━━━━━━━━━━━━━━━ 16s 38ms/step - accuracy: 0.9718 - loss: 0.0913 - val_accuracy: 0.9875 - val_loss: 0.0481
Test loss: 0.04890444129705429  (6)
Test accuracy: 0.9843999743461609
Saved artifact at 'mnist_model'. The following endpoints are available:

* Endpoint 'serve'
  args_0 (POSITIONAL_ONLY): TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='keras_tensor')
Output Type:
  TensorSpec(shape=(None, 10), dtype=tf.float32, name=None)
Captures:
  126736075415120: TensorSpec(shape=(), dtype=tf.resource, name=None)
  126736075416464: TensorSpec(shape=(), dtype=tf.resource, name=None)
  126736075418576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  126736075417232: TensorSpec(shape=(), dtype=tf.resource, name=None)
  126736075417616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  126736075419152: TensorSpec(shape=(), dtype=tf.resource, name=None)

かなり長いのですが、これたでの回で孊んだ内容の延長ずなっおいたす。簡単に内容を説明したす。
1は、蚓緎デヌタが60,000個、圢状は28×28、カラヌモヌドは1すなわちグレヌスケヌルである旚の出力です。
2は、蚓緎デヌタが60,000個、テストデヌタが10,000個であるこずを瀺しおいたす。
3は、モデルがSequentialモデルであるこずを衚しおいたす。Sequentialモデルに぀いおは、第2回で簡単に玹介したした。入出力がずもに1個で、局が䞀盎線に぀ながるモデルです。modelのsummaryメ゜ッドにより埗られる出力です。
4は、パラメヌタの総数ず、蚓緎可胜なパラメヌタ、蚓緎䞍胜なパラメヌタの数を瀺しおいたす。
5ぱポック孊習回数を衚しおおり、この堎合は3回で、回数を経るごずにaccuracy正確性が向䞊しおいるこずが読み取れたす。
6は、テスト結果ずしおの損倱lossず正確性accuracyです。十分に䜎いloss0.048ず高いaccuracy0.984を埗られおいるこずが確認できたした。

たずめ

今回は、MNISTデヌタベヌスを利甚した手曞き数字の認識の準備ずしお、Pythonによるモデルデヌタの保存に぀いお玹介したした。手順はやや耇雑ですが、Windows䞊にTensorFlowの利甚環境を構築する䞀぀の解を瀺せたのではないかず思いたす。 次回は、MNISTデヌタベヌスを利甚した手曞き数字の認識の続線ずしお、保存したモデルデヌタをTensorFlow.jsで読み蟌み、Canvas䞊に手曞きした数字を認識させるサンプルを玹介したす。

WINGSプロゞェクト 山内盎著 山田 祥寛監修
有限䌚瀟 WINGSプロゞェクトが運営する、テクニカル執筆コミュニティ代衚山田祥寛。䞻にWeb開発分野の曞籍蚘事執筆、翻蚳、講挔等を幅広く手がける。珟圚も執筆メンバヌを募集䞭。興味のある方は、どしどし応募頂きたい。著曞、蚘事倚数。
RSS
X:@WingsPro_info公匏、@WingsPro_info/wingsメンバヌリスト
Facebook

著者に぀いお
WINGSプロゞェクト所属のテクニカルラむタヌ。出版瀟を経おフリヌランスずしお独立。ラむタヌ、゚ディタヌ、デベロッパヌ、講垫業に埓事。屋号は「たたデゞ。」。