star-code.net

手書き文字分類のデモを作りました

はじめに

手書き文字分類のデモを作りました.

こちらから遊べます.

技術情報

分類器としては,以下のようなシンプルな多層パーセプトロンを実装しました.

class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.fc1 = nn.Linear(28*28,256)
        self.fc2 = nn.Linear(256,128)
        self.fc3 = nn.Linear(128,10)
    def forward(self,x):
        x = self.flatten(x)
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

とってもシンプルな全結合ネットワークです.

学習には MNIST データセットを用いました.これは,28 × 28 の手書き文字と,その手書き文字が示す数字(0 から 9 のいずれか)を示すラベルの組が大量にあるデータセットです.

Test データで 97.6 % の精度です.畳み込みニューラルネットワーク(CNN)とかにすればもうちょっと精度は上がるはず.

文字分類デモは,フロントエンドで動作しています. Python で学習したデータをバイナリ化して Web サイト上に配置したものを,TypeScript から読み出しています.

おわりに

今回作成したネットワークなどは別の企画のために作った副産物だったりします. そちらの企画のために書いたコードと混ざってしまいますが,こちらのリポジトリに学習用のコードなどを置いています.

Q. 文字が期待している通りに認識されないんだけど?

A. MNIST 風に書いてみると認識されがちです