keras-vis: Keras Visualization Toolkit
keras-visはKerasモデルの可視化とデバッグのためのハイレベルツールキットです。 現在サポートされている可視化:
- Activation maximization
- Saliency maps
- Class activation maps
全ての可視化はデフォルトでN次元の画像入力をサポートしています。 すなわち、モデルへのN次元画像入力を一般化しています。
keras-visは簡潔で使いやすく、拡張可能なインタフェースを備えています。 上記の可視化全てをエネルギー最小化問題として一般化しています。 theanoとtensorflow両方のバックエンドと互換性があり、'channels_first'と'channels_last'のデータ形式を扱えます。
クイックリンク
- https://keisen.github.io/keras-vis-docs-ja のドキュメントを読んでください。
- 質問や議論のためにSlackの チャンネル に参加して下さい。
- 私たちはwaffle.ioで新しい機能やタスクを追跡しています。PullRequestで手助けしてもらえると嬉しいです。
Getting Started
画像の誤差逆伝搬問題では、そのゴールはいくつかの損失関数を最小にする入力画像を生成することです。 画像の誤差逆伝搬問題を設定するのは簡単です。
重み付き損失関数を定義
様々な有用な損失関数がlossesで定義されます。 カスタムな損失関数はLoss.build_lossを実装することで定義できます。
from vis.losses import ActivationMaximization
from vis.regularizers import TotalVariation, LPNorm
filter_indices = [1, 2, 3]
# タプルは(損失関数, 重み係数)で構成されています。
# 必要に応じて正則化(regularizers)も追加してください。
losses = [
(ActivationMaximization(keras_layer, filter_indices), 1),
(LPNorm(model.input), 10),
(TotalVariation(model.input), 10)
]
重み付き損失を最小化するための最適化設定
自然な画像を生成するため、画像探索空間は正則化ペナルティを用いて制限されます。 いくつかの汎用的な正則化はregularizersで定義されています。 損失関数のように、Loss.build_lossを実装することでカスタムな正則化を定義できます。
from vis.optimizer import Optimizer
optimizer = Optimizer(model.input, losses)
opt_img, grads, _ = optimizer.minimize()
サポートされている可視化の様々な具体例はexamples folderで見ることができます。
インストール
Note
現在PyPIに登録されているkeras-visは古いバージョンのため、多くの不具合を含みます。 ソースコードからインストールすることをお勧めします。
-
theanoまたはtensorflowバックエンドと共にkerasをインストールします。 Kerasのバージョンが2.0以上であることに注意して下さい。
-
keras-visをインストールします。
ソースコードからインストール
sudo python setup.py install
PyPIパッケージからインストール
sudo pip install keras-vis
可視化とは
Note
現在、リンクは壊れておりドキュメント全体を修正中です。 サンプルはexamples/
配下を参照して下さい。
ニューラルネットはブラックボックスです。 近年では、畳み込みネットワークを理解し可視化するための、いくつかのアプローチが開発され、文献に掲載されています。 それらは私達にブラックボックスに耳を傾け、誤分類を診断し、ネットワークが過学習(または未学習)かどうかを評価する方法を提供します。
Guided backprop can also be used to create trippy art, neural/texture style transfer among the list of other growing applications.
さまざまな視覚化がそれぞれのページで文書化され、ここに要約されています。
Conv filter visualization
畳み込みフィルタは、類似のパターンが入力画像内に見られるとき出力を最大化する'テンプレートマッチング'フィルタを学習します。 ActivationMaximizationによってこれらのテンプレートを視覚化します。
Dense layer visualization
ネットワークが過学習(または未学習)なのか、適切に一般化できているのかをどのように評価できますか?
Attention Maps
ネットワークがその出力を決定する際、画像の正しい部分を注視しているのかをどのように評価できますか?
最適化の進捗をGIFアニメで出力する
callbacksを活用して最適化の進捗をGIFアニメとして生成可能です。 次の例は、'オゼル'クラス(output_index: 20)のActivationMaximizationによる可視化です。
from vis.losses import ActivationMaximization
from vis.regularizers import TotalVariation, LPNorm
from vis.modifiers import Jitter
from vis.optimizer import Optimizer
from vis.callbacks import GifGenerator
from vis.utils.vggnet import VGG16
# VGG16をImageNetのWeightsで構築する
model = VGG16(weights='imagenet', include_top=True)
print('Model loaded.')
# 可視化したいレイヤの名前(vggnet.pyのモデル定義を参照して下さい)
layer_name = 'predictions'
layer_dict = dict([(layer.name, layer) for layer in model.layers[1:]])
output_class = [20]
losses = [
(ActivationMaximization(layer_dict[layer_name], output_class), 2),
(LPNorm(model.input), 10),
(TotalVariation(model.input), 10)
]
opt = Optimizer(model.input, losses)
opt.minimize(max_iter=500, verbose=True, image_modifiers=[Jitter()], callbacks=[GifGenerator('opt_progress')])
出力の振動に注目してください。 これは、鮮明な活性化最大化画像を生成することが知られている[ImageModifier]の一種であるJitterを使っているからです。
エクササイズとして次に挑戦してみて下さい。
- Jitterを取り除く
- 損失の重みを変化させる
引用
もしkeras-visがあなたの研究の役立ったのなら、資料には引用をお願いします。 ここにBibTeXエントリの例を示します。
@misc{raghakotkerasvis,
title={keras-vis},
author={Kotikalapudi, Raghavendra and contributors},
year={2017},
publisher={GitHub},
howpublished={\url{https://github.com/raghakot/keras-vis}},
}