Passo 1: Instalação das bibliotecas necessárias

Primeiro, instale as bibliotecas necessárias usando pip:

In [ ]:
%pip install tensorflow numpy keras lime
Collecting tensorflow
  Using cached tensorflow-2.13.0-cp311-cp311-win_amd64.whl (1.9 kB)
Requirement already satisfied: numpy in c:\users\gvcer\documents\python\env\lib\site-packages (1.24.3)
Collecting keras
  Using cached keras-2.13.1-py3-none-any.whl (1.7 MB)
Collecting lime
  Using cached lime-0.2.0.1-py3-none-any.whl
Collecting tensorflow-intel==2.13.0 (from tensorflow)
  Using cached tensorflow_intel-2.13.0-cp311-cp311-win_amd64.whl (276.6 MB)
Collecting absl-py>=1.0.0 (from tensorflow-intel==2.13.0->tensorflow)
  Using cached absl_py-1.4.0-py3-none-any.whl (126 kB)
Collecting astunparse>=1.6.0 (from tensorflow-intel==2.13.0->tensorflow)
  Using cached astunparse-1.6.3-py2.py3-none-any.whl (12 kB)
Requirement already satisfied: flatbuffers>=23.1.21 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (23.5.26)
Collecting gast<=0.4.0,>=0.2.1 (from tensorflow-intel==2.13.0->tensorflow)
  Using cached gast-0.4.0-py3-none-any.whl (9.8 kB)
Collecting google-pasta>=0.1.1 (from tensorflow-intel==2.13.0->tensorflow)
  Using cached google_pasta-0.2.0-py3-none-any.whl (57 kB)
Collecting h5py>=2.9.0 (from tensorflow-intel==2.13.0->tensorflow)
  Using cached h5py-3.9.0-cp311-cp311-win_amd64.whl (2.7 MB)
Requirement already satisfied: libclang>=13.0.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (16.0.6)
Requirement already satisfied: opt-einsum>=2.3.2 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (3.3.0)
Requirement already satisfied: packaging in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (23.1)
Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (4.23.4)
Requirement already satisfied: setuptools in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (65.5.0)
Requirement already satisfied: six>=1.12.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (1.16.0)
Requirement already satisfied: termcolor>=1.1.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (2.3.0)
Requirement already satisfied: typing-extensions<4.6.0,>=3.6.6 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (4.5.0)
Requirement already satisfied: wrapt>=1.11.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (1.15.0)
Collecting grpcio<2.0,>=1.24.3 (from tensorflow-intel==2.13.0->tensorflow)
  Using cached grpcio-1.56.0-cp311-cp311-win_amd64.whl (4.2 MB)
Collecting tensorboard<2.14,>=2.13 (from tensorflow-intel==2.13.0->tensorflow)
  Using cached tensorboard-2.13.0-py3-none-any.whl (5.6 MB)
Requirement already satisfied: tensorflow-estimator<2.14,>=2.13.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (2.13.0)
Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorflow-intel==2.13.0->tensorflow) (0.31.0)
Requirement already satisfied: matplotlib in c:\users\gvcer\documents\python\env\lib\site-packages (from lime) (3.7.2)
Requirement already satisfied: scipy in c:\users\gvcer\documents\python\env\lib\site-packages (from lime) (1.11.1)
Requirement already satisfied: tqdm in c:\users\gvcer\documents\python\env\lib\site-packages (from lime) (4.65.0)
Requirement already satisfied: scikit-learn>=0.18 in c:\users\gvcer\documents\python\env\lib\site-packages (from lime) (1.3.0)
Collecting scikit-image>=0.12 (from lime)
  Using cached scikit_image-0.21.0-cp311-cp311-win_amd64.whl (22.8 MB)
Requirement already satisfied: networkx>=2.8 in c:\users\gvcer\documents\python\env\lib\site-packages (from scikit-image>=0.12->lime) (3.1)
Requirement already satisfied: pillow>=9.0.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from scikit-image>=0.12->lime) (10.0.0)
Collecting imageio>=2.27 (from scikit-image>=0.12->lime)
  Using cached imageio-2.31.1-py3-none-any.whl (313 kB)
Collecting tifffile>=2022.8.12 (from scikit-image>=0.12->lime)
  Using cached tifffile-2023.7.10-py3-none-any.whl (220 kB)
Collecting PyWavelets>=1.1.1 (from scikit-image>=0.12->lime)
  Using cached PyWavelets-1.4.1-cp311-cp311-win_amd64.whl (4.2 MB)
Collecting lazy_loader>=0.2 (from scikit-image>=0.12->lime)
  Using cached lazy_loader-0.3-py3-none-any.whl (9.1 kB)
Requirement already satisfied: joblib>=1.1.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from scikit-learn>=0.18->lime) (1.3.1)
Requirement already satisfied: threadpoolctl>=2.0.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from scikit-learn>=0.18->lime) (3.1.0)
Requirement already satisfied: contourpy>=1.0.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from matplotlib->lime) (1.1.0)
Requirement already satisfied: cycler>=0.10 in c:\users\gvcer\documents\python\env\lib\site-packages (from matplotlib->lime) (0.11.0)
Requirement already satisfied: fonttools>=4.22.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from matplotlib->lime) (4.40.0)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from matplotlib->lime) (1.4.4)
Requirement already satisfied: pyparsing<3.1,>=2.3.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from matplotlib->lime) (3.0.9)
Requirement already satisfied: python-dateutil>=2.7 in c:\users\gvcer\documents\python\env\lib\site-packages (from matplotlib->lime) (2.8.2)
Requirement already satisfied: colorama in c:\users\gvcer\documents\python\env\lib\site-packages (from tqdm->lime) (0.4.6)
Requirement already satisfied: wheel<1.0,>=0.23.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from astunparse>=1.6.0->tensorflow-intel==2.13.0->tensorflow) (0.40.0)
Collecting google-auth<3,>=1.6.3 (from tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached google_auth-2.22.0-py2.py3-none-any.whl (181 kB)
Collecting google-auth-oauthlib<1.1,>=0.5 (from tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached google_auth_oauthlib-1.0.0-py2.py3-none-any.whl (18 kB)
Collecting markdown>=2.6.8 (from tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached Markdown-3.4.3-py3-none-any.whl (93 kB)
Collecting requests<3,>=2.21.0 (from tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached requests-2.31.0-py3-none-any.whl (62 kB)
Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow) (0.7.1)
Requirement already satisfied: werkzeug>=1.0.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow) (2.3.6)
Collecting cachetools<6.0,>=2.0.0 (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached cachetools-5.3.1-py3-none-any.whl (9.3 kB)
Collecting pyasn1-modules>=0.2.1 (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached pyasn1_modules-0.3.0-py2.py3-none-any.whl (181 kB)
Collecting rsa<5,>=3.1.4 (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached rsa-4.9-py3-none-any.whl (34 kB)
Requirement already satisfied: urllib3<2.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow) (1.26.16)
Collecting requests-oauthlib>=0.7.0 (from google-auth-oauthlib<1.1,>=0.5->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached requests_oauthlib-1.3.1-py2.py3-none-any.whl (23 kB)
Collecting charset-normalizer<4,>=2 (from requests<3,>=2.21.0->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl (96 kB)
Requirement already satisfied: idna<4,>=2.5 in c:\users\gvcer\documents\python\env\lib\site-packages (from requests<3,>=2.21.0->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow) (3.4)
Collecting certifi>=2017.4.17 (from requests<3,>=2.21.0->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow)
  Using cached certifi-2023.5.7-py3-none-any.whl (156 kB)
Requirement already satisfied: MarkupSafe>=2.1.1 in c:\users\gvcer\documents\python\env\lib\site-packages (from werkzeug>=1.0.1->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow) (2.1.3)
Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in c:\users\gvcer\documents\python\env\lib\site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow) (0.5.0)
Requirement already satisfied: oauthlib>=3.0.0 in c:\users\gvcer\documents\python\env\lib\site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard<2.14,>=2.13->tensorflow-intel==2.13.0->tensorflow) (3.2.2)
Installing collected packages: tifffile, rsa, PyWavelets, pyasn1-modules, markdown, lazy_loader, keras, imageio, h5py, grpcio, google-pasta, gast, charset-normalizer, certifi, cachetools, astunparse, absl-py, scikit-image, requests, google-auth, requests-oauthlib, lime, google-auth-oauthlib, tensorboard, tensorflow-intel, tensorflow
Successfully installed PyWavelets-1.4.1 absl-py-1.4.0 astunparse-1.6.3 cachetools-5.3.1 certifi-2023.5.7 charset-normalizer-3.2.0 gast-0.4.0 google-auth-2.22.0 google-auth-oauthlib-1.0.0 google-pasta-0.2.0 grpcio-1.56.0 h5py-3.9.0 imageio-2.31.1 keras-2.13.1 lazy_loader-0.3 lime-0.2.0.1 markdown-3.4.3 pyasn1-modules-0.3.0 requests-2.31.0 requests-oauthlib-1.3.1 rsa-4.9 scikit-image-0.21.0 tensorboard-2.13.0 tensorflow-2.13.0 tensorflow-intel-2.13.0 tifffile-2023.7.10
Note: you may need to restart the kernel to use updated packages.
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'
WARNING: Skipping c:\Users\gvcer\Documents\Python\env\Lib\site-packages\pyparsing-3.1.0.dist-info due to invalid metadata entry 'name'

[notice] A new release of pip is available: 23.1.2 -> 23.2
[notice] To update, run: python.exe -m pip install --upgrade pip

Passo 2: Importação das bibliotecas necessárias

Importe as bibliotecas que vamos usar:

In [ ]:
import numpy as np
from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
from lime import lime_image
from skimage.io import imread
import matplotlib.pyplot as plt
c:\Users\gvcer\Documents\Python\env\Lib\site-packages\tqdm\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

Passo 3: Carregar o modelo

Carregamos o modelo que queremos explicar. Para este exemplo, usamos o modelo VGG16 pré-treinado do Keras.

In [ ]:
model = VGG16(weights='imagenet', include_top=True)
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5
553467096/553467096 [==============================] - 20s 0us/step

Passo 4: Carregar e pré-processar a imagem

Aqui, carregamos a imagem que queremos classificar e pré-processamos ela para uso com o modelo VGG16.

In [ ]:
def load_image(img_path):
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    return x

img = load_image('cat100.jpg')

Passo 5: Fazer uma previsão com o modelo

Agora, fazemos uma previsão usando o modelo:

In [ ]:
preds = model.predict(img)
1/1 [==============================] - 3s 3s/step
1/1 [==============================] - 3s 3s/step

Passo 6: Criar um explicador LIME

Aqui, criamos um explicador LIME e usamo-lo para obter uma explicação para a classificação da nossa imagem:

In [ ]:
explainer = lime_image.LimeImageExplainer()
explanation = explainer.explain_instance(img[0], model.predict, top_labels=5, hide_color=0, num_samples=1000)
  0%|          | 0/1000 [00:00<?, ?it/s]
1/1 [==============================] - 1s 1s/step
  1%|          | 10/1000 [00:01<01:49,  9.08it/s]
1/1 [==============================] - 1s 972ms/step
  2%|▏         | 20/1000 [00:02<01:47,  9.13it/s]
1/1 [==============================] - 1s 1s/step
  3%|▎         | 30/1000 [00:03<02:06,  7.67it/s]
1/1 [==============================] - 2s 2s/step
  4%|▍         | 40/1000 [00:05<02:29,  6.40it/s]
1/1 [==============================] - 2s 2s/step
  5%|▌         | 50/1000 [00:07<02:42,  5.85it/s]
1/1 [==============================] - 2s 2s/step
  6%|▌         | 60/1000 [00:09<02:51,  5.48it/s]
1/1 [==============================] - 2s 2s/step
  7%|▋         | 70/1000 [00:11<02:53,  5.38it/s]
1/1 [==============================] - 2s 2s/step
  8%|▊         | 80/1000 [00:13<02:51,  5.36it/s]
1/1 [==============================] - 2s 2s/step
  9%|▉         | 90/1000 [00:15<02:53,  5.24it/s]
1/1 [==============================] - 2s 2s/step
 10%|█         | 100/1000 [00:17<02:50,  5.26it/s]
1/1 [==============================] - 2s 2s/step
 12%|█▏        | 119/1000 [00:19<02:03,  7.15it/s]
1/1 [==============================] - 2s 2s/step
 12%|█▏        | 122/1000 [00:21<02:53,  5.07it/s]
1/1 [==============================] - 2s 2s/step
 13%|█▎        | 130/1000 [00:23<03:02,  4.78it/s]
1/1 [==============================] - 2s 2s/step
 14%|█▍        | 140/1000 [00:25<03:02,  4.71it/s]
1/1 [==============================] - 2s 2s/step
 15%|█▌        | 150/1000 [00:27<03:04,  4.60it/s]
1/1 [==============================] - 2s 2s/step
 16%|█▌        | 160/1000 [00:29<02:58,  4.72it/s]
1/1 [==============================] - 2s 2s/step
 17%|█▋        | 170/1000 [00:31<02:55,  4.74it/s]
1/1 [==============================] - 2s 2s/step
 18%|█▊        | 180/1000 [00:33<02:50,  4.81it/s]
1/1 [==============================] - 2s 2s/step
 19%|█▉        | 190/1000 [00:35<02:46,  4.86it/s]
1/1 [==============================] - 2s 2s/step
 20%|██        | 200/1000 [00:37<02:47,  4.79it/s]
1/1 [==============================] - 2s 2s/step
 21%|██        | 210/1000 [00:39<02:44,  4.80it/s]
1/1 [==============================] - 2s 2s/step
 23%|██▎       | 229/1000 [00:42<02:01,  6.33it/s]
1/1 [==============================] - 2s 2s/step
 23%|██▎       | 232/1000 [00:44<02:46,  4.61it/s]
1/1 [==============================] - 2s 2s/step
 24%|██▍       | 240/1000 [00:46<02:52,  4.40it/s]
1/1 [==============================] - 2s 2s/step
 25%|██▌       | 250/1000 [00:48<02:43,  4.58it/s]
1/1 [==============================] - 2s 2s/step
 26%|██▌       | 260/1000 [00:50<02:39,  4.63it/s]
1/1 [==============================] - 2s 2s/step
 27%|██▋       | 270/1000 [00:52<02:33,  4.76it/s]
1/1 [==============================] - 2s 2s/step
 28%|██▊       | 280/1000 [00:54<02:29,  4.81it/s]
1/1 [==============================] - 2s 2s/step
 30%|██▉       | 299/1000 [00:56<01:47,  6.51it/s]
1/1 [==============================] - 2s 2s/step
 30%|███       | 303/1000 [00:58<02:25,  4.80it/s]
1/1 [==============================] - 2s 2s/step
 32%|███▏      | 319/1000 [01:00<01:46,  6.41it/s]
1/1 [==============================] - 2s 2s/step
 32%|███▏      | 323/1000 [01:02<02:26,  4.61it/s]
1/1 [==============================] - 2s 2s/step
 33%|███▎      | 330/1000 [01:05<02:46,  4.02it/s]
1/1 [==============================] - 2s 2s/step
 34%|███▍      | 340/1000 [01:07<02:31,  4.35it/s]
1/1 [==============================] - 2s 2s/step
 35%|███▌      | 350/1000 [01:09<02:24,  4.49it/s]
1/1 [==============================] - 2s 2s/step
 36%|███▌      | 360/1000 [01:11<02:15,  4.71it/s]
1/1 [==============================] - 2s 2s/step
 37%|███▋      | 370/1000 [01:13<02:12,  4.74it/s]
1/1 [==============================] - 2s 2s/step
 38%|███▊      | 380/1000 [01:15<02:08,  4.81it/s]
1/1 [==============================] - 2s 2s/step
 40%|███▉      | 399/1000 [01:17<01:31,  6.58it/s]
1/1 [==============================] - 2s 2s/step
 40%|████      | 403/1000 [01:19<02:00,  4.97it/s]
1/1 [==============================] - 2s 2s/step
 41%|████      | 410/1000 [01:21<02:10,  4.51it/s]
1/1 [==============================] - 2s 2s/step
 42%|████▏     | 420/1000 [01:23<02:04,  4.64it/s]
1/1 [==============================] - 2s 2s/step
 43%|████▎     | 430/1000 [01:25<01:58,  4.80it/s]
1/1 [==============================] - 2s 2s/step
 44%|████▍     | 440/1000 [01:27<01:56,  4.82it/s]
1/1 [==============================] - 2s 2s/step
 45%|████▌     | 450/1000 [01:29<01:52,  4.88it/s]
1/1 [==============================] - 2s 2s/step
 47%|████▋     | 469/1000 [01:31<01:19,  6.64it/s]
1/1 [==============================] - 2s 2s/step
 47%|████▋     | 473/1000 [01:33<01:46,  4.93it/s]
1/1 [==============================] - 2s 2s/step
 48%|████▊     | 480/1000 [01:35<01:58,  4.40it/s]
1/1 [==============================] - 2s 2s/step
 50%|████▉     | 499/1000 [01:38<01:20,  6.21it/s]
1/1 [==============================] - 2s 2s/step
 50%|█████     | 503/1000 [01:40<01:52,  4.44it/s]
1/1 [==============================] - 2s 2s/step
 51%|█████     | 510/1000 [01:42<01:59,  4.11it/s]
1/1 [==============================] - 2s 2s/step
 52%|█████▏    | 520/1000 [01:44<01:49,  4.37it/s]
1/1 [==============================] - 2s 2s/step
 53%|█████▎    | 530/1000 [01:46<01:42,  4.59it/s]
1/1 [==============================] - 2s 2s/step
 54%|█████▍    | 540/1000 [01:48<01:36,  4.77it/s]
1/1 [==============================] - 2s 2s/step
 55%|█████▌    | 550/1000 [01:50<01:32,  4.86it/s]
1/1 [==============================] - 2s 2s/step
 57%|█████▋    | 568/1000 [01:52<01:06,  6.49it/s]
1/1 [==============================] - 2s 2s/step
 57%|█████▋    | 571/1000 [01:54<01:33,  4.58it/s]
1/1 [==============================] - 2s 2s/step
 58%|█████▊    | 580/1000 [01:56<01:30,  4.65it/s]
1/1 [==============================] - 2s 2s/step
 59%|█████▉    | 590/1000 [01:58<01:29,  4.59it/s]
1/1 [==============================] - 2s 2s/step
 60%|██████    | 600/1000 [02:00<01:28,  4.54it/s]
1/1 [==============================] - 2s 2s/step
 62%|██████▏   | 619/1000 [02:03<01:01,  6.23it/s]
1/1 [==============================] - 2s 2s/step
 62%|██████▏   | 623/1000 [02:05<01:21,  4.65it/s]
1/1 [==============================] - 2s 2s/step
 63%|██████▎   | 630/1000 [02:06<01:26,  4.28it/s]
1/1 [==============================] - 2s 2s/step
 64%|██████▍   | 640/1000 [02:09<01:20,  4.49it/s]
1/1 [==============================] - 2s 2s/step
 65%|██████▌   | 650/1000 [02:11<01:14,  4.67it/s]
1/1 [==============================] - 2s 2s/step
 66%|██████▌   | 660/1000 [02:13<01:11,  4.78it/s]
1/1 [==============================] - 2s 2s/step
 67%|██████▋   | 670/1000 [02:15<01:08,  4.83it/s]
1/1 [==============================] - 2s 2s/step
 68%|██████▊   | 680/1000 [02:17<01:05,  4.88it/s]
1/1 [==============================] - 2s 2s/step
 69%|██████▉   | 690/1000 [02:18<01:02,  4.98it/s]
1/1 [==============================] - 2s 2s/step
 70%|███████   | 700/1000 [02:21<01:00,  4.92it/s]
1/1 [==============================] - 2s 2s/step
 71%|███████   | 710/1000 [02:22<00:58,  4.98it/s]
1/1 [==============================] - 2s 2s/step
 72%|███████▏  | 720/1000 [02:25<00:57,  4.87it/s]
1/1 [==============================] - 2s 2s/step
 73%|███████▎  | 730/1000 [02:27<00:56,  4.76it/s]
1/1 [==============================] - 2s 2s/step
 74%|███████▍  | 740/1000 [02:29<00:55,  4.72it/s]
1/1 [==============================] - 2s 2s/step
 75%|███████▌  | 750/1000 [02:31<00:51,  4.89it/s]
1/1 [==============================] - 2s 2s/step
 76%|███████▌  | 760/1000 [02:33<00:49,  4.85it/s]
1/1 [==============================] - 2s 2s/step
 77%|███████▋  | 770/1000 [02:35<00:47,  4.84it/s]
1/1 [==============================] - 2s 2s/step
 78%|███████▊  | 780/1000 [02:37<00:45,  4.84it/s]
1/1 [==============================] - 2s 2s/step
 79%|███████▉  | 790/1000 [02:39<00:43,  4.88it/s]
1/1 [==============================] - 2s 2s/step
 80%|████████  | 800/1000 [02:41<00:40,  4.88it/s]
1/1 [==============================] - 2s 2s/step
 81%|████████  | 810/1000 [02:43<00:38,  4.89it/s]
1/1 [==============================] - 2s 2s/step
 82%|████████▏ | 820/1000 [02:45<00:36,  4.94it/s]
1/1 [==============================] - 2s 2s/step
 84%|████████▎ | 837/1000 [02:47<00:25,  6.40it/s]
1/1 [==============================] - 2s 2s/step
 84%|████████▍ | 840/1000 [02:49<00:34,  4.63it/s]
1/1 [==============================] - 2s 2s/step
 85%|████████▌ | 850/1000 [02:51<00:31,  4.78it/s]
1/1 [==============================] - 2s 2s/step
 87%|████████▋ | 868/1000 [02:53<00:20,  6.42it/s]
1/1 [==============================] - 2s 2s/step
 87%|████████▋ | 871/1000 [02:55<00:28,  4.49it/s]
1/1 [==============================] - 2s 2s/step
 88%|████████▊ | 880/1000 [02:57<00:26,  4.50it/s]
1/1 [==============================] - 2s 2s/step
 90%|████████▉ | 899/1000 [03:00<00:15,  6.57it/s]
1/1 [==============================] - 2s 2s/step
 90%|█████████ | 903/1000 [03:02<00:20,  4.66it/s]
1/1 [==============================] - 2s 2s/step
 91%|█████████ | 910/1000 [03:04<00:21,  4.26it/s]
1/1 [==============================] - 2s 2s/step
 92%|█████████▏| 920/1000 [03:06<00:17,  4.52it/s]
1/1 [==============================] - 2s 2s/step
 93%|█████████▎| 930/1000 [03:08<00:14,  4.71it/s]
1/1 [==============================] - 2s 2s/step
 94%|█████████▍| 940/1000 [03:10<00:12,  4.74it/s]
1/1 [==============================] - 2s 2s/step
 95%|█████████▌| 950/1000 [03:12<00:10,  4.77it/s]
1/1 [==============================] - 2s 2s/step
 96%|█████████▌| 960/1000 [03:14<00:08,  4.73it/s]
1/1 [==============================] - 2s 2s/step
 98%|█████████▊| 978/1000 [03:16<00:03,  6.05it/s]
1/1 [==============================] - 2s 2s/step
 99%|█████████▉| 989/1000 [03:19<00:01,  5.69it/s]
1/1 [==============================] - 3s 3s/step
 99%|█████████▉| 993/1000 [03:22<00:01,  3.68it/s]
1/1 [==============================] - 2s 2s/step
100%|██████████| 1000/1000 [03:24<00:00,  4.88it/s]

Passo 7: Visualizar a explicação

Por fim, visualizamos a explicação. Isso vai criar um mapa de calor mostrando quais partes da imagem foram mais importantes para a classificação:

In [ ]:
from skimage.segmentation import mark_boundaries
temp, mask = explanation.get_image_and_mask(explanation.top_labels[0], positive_only=True, num_features=5, hide_rest=True)
plt.imshow(mark_boundaries(temp / 2 + 0.5, mask))
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Out[ ]:
<matplotlib.image.AxesImage at 0x1b1ac2e5850>
Image

Passo 8: Decodificar as previsões

Para ver quais objetos o modelo acha que são mais prováveis, podemos decodificar as previsões:

In [ ]:
print('Predicted:', decode_predictions(preds, top=3)[0])
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json
35363/35363 [==============================] - 0s 1us/step
Predicted: [('n02124075', 'Egyptian_cat', 0.38070077), ('n02123045', 'tabby', 0.28539503), ('n02123159', 'tiger_cat', 0.13022758)]