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をクリック
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の話ではなくなる笑