Chainerで入力画像の最適化


追記 (2015-12-13)

コードを修正してv1.5に対応しました。さらに、chainer.optimizersを使うようにしました。

deep-goggle-chainer (port https://github.com/aravindhm/deep-goggle to python) · GitHub

追記ここまで


こんにちは、@mktozkです。

Chainerでやってみた第2弾です。

chainer.org

今回は入力画像の最適化を行ってみます。 具体的には、Mahendran et al., Understanding Deep Image Representations by Inverting Them, CVPR 2015 をCaffeの学習済みモデルを使ってChainerで実装します。


ちなみに、第1弾、Chainerで特徴抽出はこちら。

mktozk.hateblo.jp

はじめに

Chainerはディープラーニングの新しいフレームワークです。 既存のライブラリよりも簡単にニューラルネット(モデル)を記述できることが売りの一つになっています。

Deep Learning のフレームワーク Chainer を公開しました | Preferred Research

さらに、バージョン 1.1から、様々な学習済みのモデルが用意されているCaffeのModel Zooに対応したので、ますます便利になっています。

さて、今回、なぜ"Understanding Deep Image Representations by Inverting Them"を実装したのかと言いますと、 何かを実装しつつChainerの使い方を学びたいと考えたからです。 Deep Dream のChainer版は誰かが実装するはずなのでパス

この論文は、ニューラルネットの活性度(特徴)を可視化した研究であり、画像が求めるパラメータになっています。

ニューラルネットワークに関して最適化と言うと「ネットワークの結合重みパラメータの学習」を考える場合はほとんどだと思います。 今回の論文は、ネットワークのパラメータはあらかじめ学習により決定しておいて、 それを固定した状態で目標とする特徴を再現するように入力画像を最適化しています。

実装にあたって

著者が書いたMatlabコードが公開されており、学習率などを引用しました。

aravindhm/deep-goggle · GitHub

コードなど

Chainerは投稿時の最新版(1.1)を使っています。バージョンが古い場合は

pip install chainer -U

もしくは

cd /path/to/chainer
git pull
python setup.py install

としてアップデートしましょう。

パッケージは、Chainerおよびcaffe.CaffeFunction()を動かすのに必要なパッケージと、それに加えて

  • PIL (Pillow)

が必要です。

pip install pillow

また、https://github.com/pfnet/chainer/tree/master/examples/modelzooスクリプトを使って、 事前に学習済みモデルと平均画像をダウンロードしておきます。

python download_model.py caffenet
python download_mean_file.py

準備が整ったら、コードをここからダウンロードして実行します。

python invert.py

サンプルとして、ILSVRC12のvalidation画像を使って、conv3の可視化を行いました。 最適化の様子をアニメーションにするとこんな感じに。

f:id:mktozk:20150710021154g:plain f:id:mktozk:20150710021703g:plain

今回はcaffenetについてのみですが、他のモデルについても少しの変更だけで実装できるはずです。 ちなみにCPUでも動くはずですが、試してないのであしからず...

実装してみた感想

F.sum()だとx.gradがほとんどnanになってしまいました。 そこで、F.mean_squared_error()で代替してみたところ、うまくいきました。 (追記)F.Convolution2D()ではなく、重みを変数化しないF.convolution_2d()を使えば、F.sum()でいけました... Chainerを悪く言ってしまい、申し訳ありませんでした m(_ _)m

また、caffe.CaffeFunction()でモデルを読み込むのに数分くらいかかります(最適化計算自体はGPUで15秒程度)。 動かす際には、モデルをあらかじめ読み込んでおいてそれから様々な層について計算すると、ストレスが少ないと思います。

最後に

Chainerを使うことでCaffeで実装したときよりもすっきり書けた気がします。 しかもCaffeをインストールせずにCaffeのモデルを使うことができるのは、手間がかからず便利です。

Chainerは確かにモデルの定義は少ない行数で書くことはできますが、学習の速度等はまだ未知数な気がします... こんな感じでCaffeのpythonラッパーのかわりにChainerを使うのがいいのかもしれませんね。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)