こんにちは、ほけきよです。
DeepMindが数日前に、tensorflowを用いたモジュール"sonnet"をオープンソース化しました。
普段Kerasしか使っていないのですが、ちょっとだけ触ったり調べたりしたので
- インストール方法
- Exampleについて
- Kerasとの違い。想定ユーザ
など、所感とともにメモとして残しておきます。
sonnetとは
- DeepMind(今一番キテるGoogle傘下の研究所)が社内用に使っていた深層学習用ライブラリ
- tensorflowのラッパー的立ち位置(tensorflowが入っていることが必要)
- Linux/MacOSXで対応
requirement
- python2.7 : 3系はまだ対応していないそう
- tensorflow >= 1.0.1 : Deeplearning用ライブラリ
- bazel (>= 0.4.5 ) : Google謹製のビルドツール
- java >= 1.8+
インストール方法
bazelのインストール
Documentをみる。自分のOSに応じて。(今回は MacOSXのhomebrew)
brew cask install java #javaのインストール brew install bazel
sonnetをダウンロード、チェック
git clone --recursive https://github.com/deepmind/sonnet cd sonnet/tensorflow ./configure
ないものはエラーに従って入れていく。
./configure
で色々聞かれる(コンパイラを最適なやつ使うかとか、OpenCL使うかとか、pythonのパスとか)
別にこだわりがない人はEnter連打で(でも一応メッセージはみておこう)
うまくいくとこんなメッセージが。
Extracting Bazel installation... .............................................................. INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes. ............................................................. INFO: All external dependencies fetched successfully.
ビルド、インストール
sonnetをビルド
mkdir /tmp/sonnet bazel build --config=opt :install ./bazel-bin/install /tmp/sonnet
/tmp/sonnet以下にpip installできるファイルができるので、
pip install /tmp/sonnet/*.whl
とする。これで完了
チェック
pythonを起動し、以下のコードを打つ
import sonnet as snt import tensorflow as tf snt.resampler(tf.constant([0.]), tf.constant([0.]))
下記の表示になればOK
<tf.Tensor 'resampler/Resampler:0' shape=(1,) dtype=float32>
Exampleを試す
タスク
使えるようになったので、exampleを実際に動かしてみる。 普通こういうのはMNISTを使って分類が定番だが、今回のexampleはRNN(多層のLSTM)を使ったもの。まだexampleはそれしか用意されていないよう。
中身のコードを見ながらLSTMをどうやって書くのか眺めるのはいいかもしれない。今回は結果だけ。
データセット
シェークスピアの“CORIOLANUS”を使って学習させ、それっぽい文章を生成するRNNを作ろうという感じ。
Coriolanus (The New Cambridge Shakespeare)
- 作者: William Shakespeare,Bridget Escolme,Lee Bliss
- 出版社/メーカー: Cambridge University Press
- 発売日: 2010/01/21
- メディア: ペーパーバック
- この商品を含むブログを見る
結果
中身は置いておいて、とりあえず実行してみる。*1
python rnn_shakespear.py
はじめにWARNINGがたくさんでた後に、学習が進んだ。WARNINGは
「お前、もっと環境を最適化できるけどしないの?」
というやつ。
結果はたまに文章ぽいのもあるがちゃんとした文章とは程遠い。学習データが少ないから?
INFO:tensorflow:9999: Training loss 78.764648. Validation loss 100.533051. Sample = b_0: ht this, and we letter my house of Hereford,|Will reason at wailer, I have by found you.||BENVOLIO:| No, therefore, none me thy ear, or we were not a|great-father uncle Edward's right divined soul six with his first,| And then I tear the back of pleasure; and our sword| To bowly me of preceion dubfil-god:|Go well in Aufidius to year:| You may not show thy length.| |PARIS:| His lady.| |POLIXENES:|So Margaret.| |LEONTES:|Hail, sir, too saying!| |NORTHUMBERLAND:|So parentme: call me wench-for my greatest,| Twear have a man; twerver it sorrows I lovely curs you,|Gives me, encorst, for his masters did not myself;| For thy welcome visiting name of your native|hath not all thy desires to run broke us| Yon me--and Phoebus Derby, be said, hast thou no man all, my oaths,|Break not that maids with this nighuls of your life| Will grow themselves: both best in earth! had he were no;| Who adveral with punish made both|To do them, and majesty, Aumelle;|Many to this the coming love marriage|What, lost deny here: h INFO:tensorflow:Reducing learning rate. INFO:tensorflow:Test loss 129.366608
また、学習したモデルは /tmp/sonnet
以下に保存される。
中身をちょっとだけ見る
sonnetでは、Deeplearningのネットワークをを作る部品がsonnet/python/modules
に色々と揃っている。
sonnet/sonnet/python/modules at master · deepmind/sonnet · GitHub
例えば
- conv : CNNのconvolution層を作ることができる
- gated_rnn : LSTMなど、RNNに用いるゲートを作ることができる
また、ここに、いくつかの既製のネットワークがあるようだ。
sonnet/mlp.py at master · deepmind/sonnet · GitHub
- Alexnet
- ConvNet
- Multi Layer Perceptron
- Dilation
(例 : AlexNetのアーキテクチャ(Krizhevsky 2012))
例えば、自分でネットワークを作りたければ↓のようにネットワークを構成していく (DeepMindのSonnetを触ったので、TensorFlowやKerasと比較しながら解説してみた より拝借)
def build(inputs): outputs = snt.Conv2D(output_channels=32, kernel_shape=4, stride=2)(inputs) outputs = snt.BatchNorm()(outputs) outputs = tf.nn.relu(outputs) outputs = snt.BatchFlatten()(outputs) # TensorFlow weight = tf.Variable(tf.truncated_normal(shape=[4096,10])) bias = tf.Variable(tf.constant(0.1, shape=[1,10])) outputs = tf.matmul(outputs, weight) + bias outputs = tf.nn.relu(outputs) return outputs model = snt.Module(build)
学習はtensorflowの記法にしたがって行う。
これがKerasだと、以下のような感じで書く
model = Sequential() model.add(Conv2D(32, kernel_size=(2,2), activation='relu', input_shape=(28,28,1)) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Flatten()) model.add(Dense(10)) model.compile(loss='mean_squared_error', optimizer=Adam())
学習はmodel.fit(...)
を使う。
最も大きな違いは
- sonnetはtensorflowとコード上で組み合わせて使うことができる
- Kerasはkerasとして閉じている
ということ。これは一長一短で、Kerasは全てKerasとして使うことができるので、終始一貫して直感的に扱うことができるように構成されている。しかし少し手の込んだネットワークに拡張しようとすると、柔軟性が低いと感じることがある。
一方でsonnetは面倒なところだけをモジュール化して、細かく設定したい時にはtensorflowをそのまま用いることができるので、自分で柔軟性を自由に調節できる。 しかし、tensorflowを使うのは、Kerasに比べて少し敷居が高いように感じられる。
あとは、ドキュメントやtutorialが圧倒的に少ない。そしてもちろん日本語はない。
所感
sonnetは、すでにtensorflowを使っている強い人たち が対象なのかなって思った。 そういう意味ではまさにDeepMindの社員が使うようなイメージに近い。面倒なところをなるべく省いて、本当に大事なところだけ集中するためのツール、というイメージでした。研究者の間では流行るかもしれない。
個人的には、Kerasを使えればまずはいいかな… もうちょっとtensorflowになれる必要があるなと感じました。
*1:ちゃんと勉強したらまたメモとして記事にしようかな…