A Day in the Life

TensorFlow.js を使い、ひらがなを推論する

TensorFlow.js を触ってみるがてら、ブラウザのみでひらがなを推論させるデモを作った。

ひらがな推論

元データセットでの正解率は99.0%ほどなのだけど、ペンや筆で書かれた筆跡を学習したためか、ブラウザ上で書く文字だと割と推定ミスをする。「か」とか難しい。

ブラウザでロードしている重みなどの学習データは437KB、モデル情報は49KB。Python の TensorFlow で 48x48ピクセルのグレースケールにしたひらがなデータ約70000万字を、20層100ニューロンの素朴な全結合層で71クラス分類の学習したものを変換して使っている。学習済データのサイズは、keras(高水準API)でのモデルのデータは5MBほどで、tensorflowjs_converter --quantize_uint8 --input_format keras input.h5 output_dir のオプションで JS 向けに変換した所、モデル情報がJSONで49KB、学習済みデータが437KBほどとそこそこ小さくなった。さらに gzip で20%ぐらい削減できる。

ひらがなの元データは、文字画像データセット(平仮名73文字版)で、画像のライセンスはパブリック・ドメイン・マーク 1.0とのこと。このなかから、ゑとゐを除く71文字を利用した。

keras から TensorFlow.js への変換操作自体はドキュメント通りなので簡単なのだけど、サポートしている機能がオフィシャルのAPIのみ。

Models using unsupported ops or layers—e.g. custom layers, Lambda layers, custom losses, or custom metrics—cannot be automatically imported, because they depend on Python code that cannot be reliably translated into JavaScript.

カスタムロス関数等などはよく使うであろうから、素朴な keras (や Python の TensorFlow) 実装のものでないとうまく行かなそう。このへんは TensorFlow.js で利用することを念頭に Python 上でモデルを作るか、もしくは最初から Python を使わず TensorFlow.js でモデル作って学習させてしまったほうが良いかも知れない。いまは node + GPU サポートもあるみたいだし、APIも結構充実している


TensorFlow.js や TensorFlow Lite、制約はあれどブラウザやスマートフォンなど各種エッジデバイス上で推論ができて面白い。今はだいぶ気軽に推論できるようになっているんだなーと感心した。

記事の一覧 >