Ejemplo de visualización de activaciones de capas

| Última modificación: 20 de septiembre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Cuestiones como un ejemplo de visualización de activaciones de capas se presentan como ayudas para comprender cómo funcionan, de forma práctica, este tipo de alternativas. Por ello, en este post, te exponemos un ejemplo de visualización de activaciones de capas.

Ejemplo de visualización de activaciones de capas

Para este ejemplo de visualización de activaciones de capas vamos primero a visualizar las activaciones de la última capa (saliency). Para ello, necesitamos cambiar la activación de la última capa, de softmax a lineal, para una correcta visualización.

%tensorflow_version 1.x

TensorFlow 1.x selected.

# instalamos las versiones adecuadas, si no, no funcionará
#!pip uninstall vis -y
#!pip uninstall keras-vis -y
#!pip uninstall keras-vis-temp -y
#!pip install git+https://github.com/raghakot/keras-vis.git -U
#!pip install scipy==1.1.0
!pip uninstall vis -y
!pip uninstall keras-vis -y
!pip uninstall keras-vis-temp -y
!pip install git+https://github.com/raghakot/keras-vis.git -U
!pip install scipy==1.1.0
!pip install 'h5py==2.10.0' --force-reinstall
from keras.applications import VGG16
from vis.utils import utils
from keras import activations
Using TensorFlow backend.
# Build the VGG16 network with ImageNet weights
model = VGG16(weights='imagenet', include_top=True)

# Compilamos el modelo
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])

# Utility to search for layer index by name. 
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'predictions')

# Swap softmax with linear
model.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)
# imports necesarios
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 6) # tamaño de las imágenes

Ahora, en el ejemplo de visualización de activaciones de capas vamos a trabajar con dos imágenes reales para ver dónde se está fijando la red:

img1 = utils.load_img('https://image.ibb.co/ma90yJ/ouzel2.jpg', target_size=(224, 224))
img2 = utils.load_img('https://image.ibb.co/djhyky/ouzel1.jpg', target_size=(224, 224))

f, ax = plt.subplots(1, 2)
ax[0].imshow(img1)
ax[0].grid(False)
ax[0].axis('off')
ax[1].imshow(img2)
ax[1].grid(False)
ax[1].axis('off')

(-0.5, 223.5, 223.5, -0.5)

A la función visualize_saliency tenemos que pasarle el modelo, el id de la capa, el ID de la clase para la que queremos ver las activaciones, y la imagen para la que queremos ver las activaciones.

El ID de la clase para la que queremos ver las activaciones funciona en el caso de la VGG16 con los pesos de la ImageNet, la clase pájaro es la 20, por lo que, si le metemos una imagen de un pájaro, debería activarse bastante e indicarnos en qué se fija para decidir que efectivamente es un pájaro. Si le metiésemos un 64, buscaría una green mamba, que es una serpiente, por lo que las activaciones deberían ser mucho menores.

Aquí puedes comprobar el listado completo de las 1000 clases.

Ahora, vamos a ver las activaciones para nuestras dos imágenes de ejemplo de visualización de activaciones de capas:

from vis.visualization import visualize_saliency
from vis.utils import utils
from keras import activations

# con esta línea encontramos el índice de la capa predicciones, que es la que
# queremos ver sus activaciones
layer_idx = utils.find_layer_idx(model, 'predictions')
print('Número de capa: ', layer_idx)

f, ax = plt.subplots(1, 2)
for i, img in enumerate([img1, img2]):    
    
    # 20: 'water ouzel, dipper'
    grads = visualize_saliency(model, layer_idx, filter_indices=20, seed_input=img, backprop_modifier='guided')
    
    # vamos a ver las activaciones con el colormap=jet, que es adecuado para ver
    # mapas de probabilidades
    ax[i].imshow(grads, cmap='jet')
    ax[i].grid(False)

Mira cómo aparecen las zonas en las que se fija nuestra red para hacer la predicción.

Vamos a probar otro método de visualización: el cam-saliency.

En este caso, la visualización contiene más detalles, ya que hace uso de la información no solo de la capa indicada, sino también de la anterior capa Conv o Pool que encuentre.

import numpy as np
import matplotlib.cm as cm
from vis.visualization import visualize_cam, overlay

for modifier in [None, 'guided', 'relu']:
    plt.figure()
    f, ax = plt.subplots(1, 2)
    plt.suptitle("vanilla" if modifier is None else modifier)
    for i, img in enumerate([img1, img2]):    
        # 20 es el indice correspondiente a la clase 'ouzel'
        grads = visualize_cam(model, layer_idx, filter_indices=20, 
                              seed_input=img, backprop_modifier=modifier)        
        # como la salida es una imagen 2D, tenemos que convertirla a 3D para
        # poder mostrarla 
        jet_heatmap = np.uint8(cm.jet(grads)[..., :3] * 255)
        ax[i].imshow(overlay(jet_heatmap, img))
        ax[i].axis('off')
<Figure size 1296x432 with 0 Axes>
model.summary()

En este post, te hemos compartido un ejemplo de visualización de activaciones de capas que esperamos haya sido de ayuda. Ahora, te animamos a continuar con tu formación y, para ello, te recomendamos nuestro Bootcamp Full Stack Big Data, Inteligencia Artificial & Machine Learning.

Esta formación intensiva te acercará a muchos más sistemas, lenguajes y herramientas que trabajan con los macrodatos, de forma que te convertirás en un data scientist experto al saber escoger las mejores alternativas para un procesamiento de datos. De hecho, KeepCoding se reconoce por formar profesionales curiosos, cuestionadores, amantes del trabajo eficaz y buscadores incansables de la autosuperación y del desafío intelectual. ¡Apúntate!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado