[LSTM文章生成]ml5jsを使う


Javascript Advent Calendar 2019 の24日目

LSTMってなんぞや

文章データを学習したmodelに対して、始まりの文字を与え、次に来る文字を推測させるというものです。

利用したライブラリー

ml5js

ml5
tensorflowのモデルを使用しjsで扱いやすくしてくれる。

tensorflow

モデル生成に利用します。
tensorflow

事前準備

インストールするもの

  • Python
    • tensorflowを動かすために必要
  • Anaconda
    • Pythonのディストリビューション。機械学習・科学計算で使うライブラリがまとまっている。Python本体もインストールされます。
  • pip
    • Pythonパッケージのインストールに利用する(TensorFlowはpipで入れます)
  • nodejs
    • ml5ライブラリーフロントエンド側を動かす為に利用する

私はAnacondaでPythonをインストールして、pipでTensorFlowをインストールしました。

環境

OS:windows 10
(ゲーミングPCです。負荷がそれなりにかかりそうと思いあえて。)

トレーニング用セット

こちらをダウンロードします
training-charRNN

git clone https://github.com/ml5js/training-charRNN.git

データを用意

後にも先にもここが一番大変な所なんですが、とりあえず動かせるようにする為、適当な文章データを用意しておきます。

日本語データを用意するのは文節等分ける作業が大変なので英語データにしましょう。日本語については後日まとめてみようと思っています。

ファイル名:input.txt
配置場所:training-lstm-master/[any_holder_name]/

input.txtに文章を入力し保存します。

参考データ

フリーで使える英文の小説や物語が公開されています。試しに利用するのであれば、こちらから元となるデータを用意してみるだけでも良いかと思います。
Project Gutenberg

トレーニングさせる

  • AnacondaPromptを起動
  • トレーニング用セットの、ディレクトリ配下に移動します。
cd training-lstm-master
  • 作成したデータをトレーニングさせる
python train.py --data_path=./[any_holder_name]/input.txt

この後トレーニングが始まり、終わるとmodels/input/にファイルが生成されています。

生成されるファイル群

  • embedding
  • manifest.json
  • rnnlm_multi_rnn_cell_cell_0_basic_lstm_cell_bias
  • rnnlm_multi_rnn_cell_cell_0_basic_lstm_cell_kernel
  • rnnlm_multi_rnn_cell_cell_1_basic_lstm_cell_bias
  • rnnlm_multi_rnn_cell_cell_1_basic_lstm_cell_kernel
  • rnnlm_softmax_b
  • rnnlm_softmax_w
  • Variable
  • vocab.json

このファイル群を後で説明するml5-examplesで利用します。

エラーが起きたら

私は、tensorflow最新バージョンを入れていたのですが、怒られたんですよね。
(その時のエラー内容はすみませんが千の風になってしまいました。)

仕方なく tensorflow 1.15.0 を入れました。

1系の関数に書き換えないといけず、train.pyの下記を修正しています。

# hide logs
tf.logging.set_verbosity(tf.logging.ERROR)

# hide logs
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)

まだフロントエンドの話になっていないので、アドベント的にこれいいのかなと不安に襲われる・・

フロントエンド

やっとjavascriptの話にたどりつきました。
では先ほど作成したmodelを使ってみようと思います。

ファイル群を移動

こちらをダウンロードします
ml5-examples

git clone https://github.com/ml5js/ml5-examples.git

nodejsのpackageを利用しているのでいつものやつ

npm install

ファイル群を移動

先ほど生成したmodels/input/配下のファイル群を移動させる。

移動先
https://github.com/ml5js/ml5-examples/tree/release/p5js/CharRNN/CharRNN_Text/models/woolf

※inputフォルダは文章に合わせたフォルダ名にすることをお勧めします。

例)
猫についての文章
ml5-examples-master/p5js/CharRNN/CharRNN_Text/models/cat

占いについての文章
ml5-examples-master/p5js/CharRNN/CharRNN_Text/models/horoscope

modelを指定する

sketch.jsにmodelsの指定があるので、「woolf」の所を先程models配下に作成したフォルダ名にする。

charRNN = ml5.charRNN('./models/woolf/', modelReady);

local serverを立ち上げる

python 3系

python -m http.server

python 2系

python -m SimpleHTTPServer

http://localhost:8000/ を開くとディレクトリが見えると思います。

CharRNN Textを使う

pl5jsをクリック

CharRNNをクリック

CharRNN_Textをクリック

Generaterの画面にたどり着きます。

seed text: 最初に与える文字
length: 生成したい文字数
temperature: 重さ・深さ

seed text:happy
length:100
temperature:0.5で生成した文章

happy and the other grown herself, 'I was than the bottle my to little sing how the poor comly up and gut

seed text:happy
length:100
temperature:1で生成した文章

happys! All spomes wife a 'How finE it?' said 'Hares" should neven backed as much had right gaim--'

文章としては支離滅裂です。

さて私は何の文章をデータとしたでしょうか。
後者の生成した文章にヒントが載っています。

ヒント「うさぎ」。

答え:Alice's Adventures in Wonderland

後者の文章はtemperatureを1にしたので、前者(temperature:0.5)に比べて、よりAlice's Adventures in Wonderlandっぽい文章となっているはずです。

確かに「うさぎ」とか「権利」とかの部分にそれっぽさが出ているような気がします。

ml5.CharRNNについてもっと調べていきたくなりました。

mecabを使い日本語の文章データを用意させれば日本語文章もいけるかも!という話をきいたので時間をみて、やってみようと思います。完全にjavascriptの話ではなくなる笑

参考記事