LoginSignup
8
6

More than 3 years have passed since last update.

[LSTM文章生成]ml5jsを使う

Last updated at Posted at 2019-12-23

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をクリック

FireShot Capture 017 - Directory listing for _ - localhost.png

CharRNNをクリック
FireShot Capture 018 - Directory listing for _p5js_ - localhost.png

CharRNN_Textをクリック
FireShot Capture 019 - Directory listing for _p5js_CharRNN_ - localhost.png

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

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

FireShot Capture 022 - LSTM Text Generation Example - localhost.png

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

FireShot Capture 023 - 翻訳 - Google 検索 - www.google.com.png

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--'

FireShot Capture 026 - 翻訳 - Google 検索 - www.google.com.png

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

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

ヒント「うさぎ」。

答え:Alice's Adventures in Wonderland

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

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

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

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

参考記事

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6