Keras KMNISTでサクッと遊んでみる

今回は 日本語くずし字データセット KMNISTを使ってサクッと遊んでみたいと思います。

こんにちは cedro です。

最近、人文学オープンデータ共同利用センターは、KMNIST という日本語くずし字データセットが発表しました。データセットは3種類あり、Kuzushiji-MNIST(ひらがな10文字)、Kuzushiji-49(ひらがな49文字)、Kuzushiji-Kanji(漢字3832文字)です。

特に、Kuzushiji-MNIST は日本語くずし字というかなりニッチな領域のデータを、あのデータセットのスタンダード MNISTと完全互換の仕様に仕上げたという、意欲的なデータセットです。

ということで、今回は 日本語くずし字データセット KMNISTを使ってサクッと遊んでみたいと思います。

 

データセットをダウンロードする

GithubからフォルダーをCloneするかDownloadZIPします。フォルダーの中の download_data.py を動かすとデータセットを簡単にダウンロード出来ます。

 

download_data.py を動かした時の画面です。こんな風に、数字を選択するだけで好みのデータセットをダウンロードできます。

1) Kuzushuji-MNIST を 2)NumPy data format (.npz) でダウンロードし k フォルダーを作って保管します。

 

kmnist のデータセットの中身を見るコードです。フォルダーの中で、このコードを実行します。

 

コードの実行結果です。x_trainのシェイプは(60000, 28, 28)、x_testのシェイプは(10000, 28, 28) とMNISTと全く同じです。文字は、ひらがの中から「お、き、す、つ、な、は、ま、や、れ、を」の10文字を選んでいます。さすが、くずし字、全く読めないような文字も混ざっています(笑)。

 

変分オートエンコーダーで使ってみる

CNNを使った分類は既に色々な方々がやっているので、今回は変分オートエンコーダで kmnist のデータセットを使ってみます。今回、流用するのは、このコードです。

 

コードはデータセットの読み込み部分を、上記の様に変更するだけです。

注意点は、pydot と graphviz をインストールしてない場合は、ImportError: Failed to import pydot. You must install pydot and graphviz for pydotprint to work. というエラーになりますので、インストールするか、147行目・157行目・190-192行目の plot_model (モデルを図示するコマンド)をコメントアウトして下さい。

また、keras と tensorflow のバージョンによっては、 TypeError: compile() missing 1 required positional argument: ‘loss’ というエラーが出る場合がありますので、この場合は vae.compile(optimizer=’adam’) → vae.compile(optimizer=’adam’, loss = ”)  に変更して下さい。

さて、コードを実行します。vae_mlp ですので、ノートブックでサクサク動きます。私のMacbookAir では15sec/epochくらいで、 50epoch が13分弱で完了します。

 

2次元マップに文字データのラベルをマッピングした結果です。まずまず、上手く分布しているようです。なお、赤色の文字は、後で追加したもので、参考です。

 

2次元マップに画像をマッピングした結果です。中心部は色々な文字が連続的に変化していますが、周辺部は結構固定的なイメージです。

それでは、2次元マップの中心部のデータ(トロ身の部分)を使って、KMNISTのモーフィング動画(gif動画)を自動で作ってみます。

 

このコードを♯ MNIST dataset の直前に追加します。それから、fig フォルダーを作成します。

6-9行目で中心(0, 0) 半径2の円周上のx, y座標を100ペア取得し、11-17行目でそのデータを元に2次元マップから画像を生成し、先程作成した figフォルダーに保存します

20-25行目で figフォルダー内の画像を元に gif動画を作成し ‘kmnist.gif’ で保存します。なお、duration は1枚当たりの表示時間で単位は1/1000秒、loop = 0 で無限ループの設定です。

さて、既に先程の学習結果が重みファイル(vae_mlp_mnist.h5)として保存されていますので、今度は重みファイルを読みこんで実行すれば、新たに学習する必要はなく直ぐ完了します。

python variational_autoencoder.py -w vae_mlp_mnist.h5  という感じで、通常の実行コマンドに、 -w 重みファイル名 のオプションを付けて実行します。

kmnist.gif の画像です。くずし字がダンスしてます(笑)。r の値を変更させると変化が変わります。

 

せっかくなので、Kuzushiji-49でもやってみました。設定は r =4 です。

ひらがな49文字をVAEすると相当表現力が上るのかと思ったのですが、さすがにそれは無理でした(笑)。たぶん、2次元マップに写像する時に、文字同士で領土の取り合いをするのでしょうが、弱い文字は強い文字に消されてしまうようです。

いやーそれにしても、人文学オープンデータ共同利用センターは意欲的なデータセットを作ったものです。Twitterでも話題になっていましたね。

最後に、KMNISTの改造したコードの全体を載せておきます。

では、また。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

2017年8月に、SONY Neural Network Console に一目惚れして、ディープラーニングを始めました。初心者の試行錯誤をブログにしています。