C言語ニューラルネットワーク用フレームワーク”darknet”でRNNをお試し

darknetというC言語で書かれたオープンソースのニューラルネットワーク用フレームワークでRNNによる文章自動作成のお試しログです。

■環境


vagrant (2.0.2)上の CentOS Linux release 7.4.1708 (Core)

GPUなし

■公式サイト


https://pjreddie.com/darknet/

■インストール


公式サイトの手順通りものすごく簡単です。

自前データでの学習を試す場合は make する前に example/rnn.cの train_char_rnn() という関数の重みファイルの出力ディレクトリを変更する必要があります。

また GPUを使用する場合は Makefileを編集するだけでOKだそうですが、今回はCPUで実行しました。

 

■公開されいている学習済みの重みファイルを使用してみる


rnnを実行するコマンドは下記の通り

<weights>の部分に学習済みの重みファイルを指定すると、その重みに基づいた文章を生成してくれます。オプションで作成する文章のlengthやseedを設定できるようです。

試しに公式サイトで公開されている grrm.weights という重みファイルを使って、”Beautiful”というseedを与えてみた結果はこのようになりました。

※この重みファイルの元となったジョージ・R・R・マーティンさんについて
https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%BC%E3%82%B8%E3%83%BBR%E3%83%BBR%E3%83%BB%E3%83%9E%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3

 

■学習を試してみる


公式サイトで紹介されているシェイクスピアのコーパスファイルをダウンロードして学習してみます。

学習する時のコマンドは下記のような形式になります。

今回試した環境では、rnn.train.cfgをデフォルト設定のまま実行するとメモリ枯渇でsegmentation faultになってしまいましたので、今回はとりあえず動作を見るだけという事にしてコンフィグの設定をデフォルト状態から変更しました。

batch=20
time_steps=3
[rnn]で設定されている各階層の入出力を512
に設定しました。

実行すると途中経過が表示されていきます。

 

途中で出力される重みファイルのバックアップを使用して文章を生成してみると以下のようになりました。( rnn.cfgのrnnの各層の入出力を学習時の設定と同じにしてから実行します。)
seedは “It” です。

 

少し学習しただけなので文章どころか英単語にすらなってない箇所の方が多い状態ですが、学習が進めば英語を生成するようになる、のでしょうね・・・。