PyTorch 1.5 レシピ : 説明可能性, Captum : Captum を使用したモデル説明可能性

PyTorch 1.5 レシピ : 説明可能性, Captum : Captum を使用したモデル説明可能性 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/15/2020 (1.5.0)

* 本ページは、PyTorch 1.5 Recipes の以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

説明可能性, Captum : Captum を使用したモデル説明可能性

Captum は貴方のモデルがどのように動作するかを明らかにし、データ特徴がモデル予測やニューロン活性にどのように影響を与えるかを理解する助けとなります。

Captum を使用すれば、統一された方法での Guided GradCam と統合勾配 (= Integrated Gradients) のような広範囲な最先端の特徴 attribution アルゴリズムを適用できます。

このレシピでは次を行なうために Captum をどのように使用するかを学習します : * 画像分類器の予測を対応する画像特徴に帰着する。* attribution 結果を可視化する。

 

始める前に

Captum が active な Pyhton 環境にインストールされていることを確実にしてください。Captum は GitHub 上で、pip パッケージ、あるいは conda パッケージとして両者が利用可能です。詳細な手順についえは、https://captum.ai/ のインストールガイドを調べてください。

モデルについては、PyTorch の組込み画像分類器を利用します。Captum はサンプル画像のどのパートがモデルにより作られたある予測を支持しているかを明らかにします。

import torchvision
from torchvision import transforms
from PIL import Image
import requests
from io import BytesIO

model = torchvision.models.resnet18(pretrained=True).eval()

response = requests.get("https://image.freepik.com/free-photo/two-beautiful-puppies-cat-dog_58409-6024.jpg")
img = Image.open(BytesIO(response.content))

center_crop = transforms.Compose([
 transforms.Resize(256),
 transforms.CenterCrop(224),
])

normalize = transforms.Compose([
    transforms.ToTensor(),               # converts the image to a tensor with values between 0 and 1
    transforms.Normalize(                # normalize to follow 0-centered imagenet pixel rgb distribution
     mean=[0.485, 0.456, 0.406],
     std=[0.229, 0.224, 0.225]
    )
])
input_img = normalize(center_crop(img)).unsqueeze(0)

 

Attribution を計算する

モデルの top-3 予測の中にクラス 208 と 283 があり、これらは犬と猫に相当します。

Captum の Occlusion アルゴリズムを使用して、これらの予測の各々を入力の対応する部分に帰着しましょう。

from captum.attr import Occlusion

occlusion = Occlusion(model)

strides = (3, 9, 9)               # smaller = more fine-grained attribution but slower
target=208,                       # Labrador index in ImageNet
sliding_window_shapes=(3,45, 45)  # choose size enough to change object appearance
baselines = 0                     # values to occlude the image with. 0 corresponds to gray

attribution_dog = occlusion.attribute(input_img,
                                       strides = strides,
                                       target=target,
                                       sliding_window_shapes=sliding_window_shapes,
                                       baselines=baselines)


target=283,                       # Persian cat index in ImageNet
attribution_cat = occlusion.attribute(input_img,
                                       strides = strides,
                                       target=target,
                                       sliding_window_shapes=sliding_window_shapes,
                                       baselines=0)

Occlusion に加えて、Captum は Integrated Gradients, Deconvolution, GuidedBackprop, Guided GradCam, DeepLift そして GradientShap のような多くのアルゴリズムをフィーチャーします。これらのアルゴリズムは Attribution のサブクラスで、これはモデルが初期化時に callable forward_func であることを想定して attribute(…) メソッドを持ちます、これは統一形式で attribution 結果を返します。

画像の場合の計算された attribution 結果を可視化しましょう。

 

結果を可視化する

Captum の可視化ユティリティは絵とテキスト入力の両者に対して attribution 結果を可視化する独創的な方法を提供します。

import numpy as np
from captum.attr import visualization as viz

# Convert the compute attribution tensor into an image-like numpy array
attribution_dog = np.transpose(attribution_dog.squeeze().cpu().detach().numpy(), (1,2,0))

vis_types = ["heat_map", "original_image"]
vis_signs = ["all", "all"], # "positive", "negative", or "all" to show both
# positive attribution indicates that the presence of the area increases the prediction score
# negative attribution indicates distractor areas whose absence increases the score

_ = viz.visualize_image_attr_multiple(attribution_dog,
                                      center_crop(img),
                                      vis_types,
                                      vis_signs,
                                      ["attribution for dog", "image"],
                                      show_colorbar = True
                                     )


attribution_cat = np.transpose(attribution_cat.squeeze().cpu().detach().numpy(), (1,2,0))

_ = viz.visualize_image_attr_multiple(attribution_cat,
                                      center_crop(img),
                                      ["heat_map", "original_image"],
                                      ["all", "all"], # positive/negative attribution or all
                                      ["attribution for cat", "image"],
                                      show_colorbar = True
                                     )

データがテキストであるならば、visualization.visualize_text() は入力テキストの上の attribution を調べるための専用ビューを提供します。

http://captum.ai/tutorials/IMDB_TorchText_Interpret で更に見つけてください。

 

Final Notes

Captum はビジョン、テキスト等を含む様式に渡り PyTorch の殆どのモデルタイプを扱うことができます。Captum で貴方は以下ができます : * 上で示されたように、特定の出力をモデル入力に帰着する。* 特定の出力を隠れ層ニューロンに帰着する (Captum API リファレンス参照)。* 隠れ層ニューロン・レスポンスをモデル入力に帰着する (Captum API リファレンス参照)

サポートされるメソッドの完全な API とチュートリアルのリストについては、web サイト http://captum.ai を調べてください。

Gilbert Tanner による他の有用な投稿 : https://gilberttanner.com/blog/interpreting-pytorch-models-with-captum

 
以上