2021.03.13 19:10 prosty przykład jak wizualizować co robi convnet

Szukałem ostatnio dobrego przykładu na wizualizowanie, jak działa dana sieć neuronowa. Wiem, że jeden ze sposobów polega na tym, żeby znaleźć takie wejście, dla którego wyjście z danego filtra danej warstwy było maksymalne, no i to daje jakieś tam pojęcie, czego szuka ten filtr. Wiem też, że żeby to zrobić, trzeba zacząć od losowego wejścia, zapodawać je do sieci, wyznaczać gradient tego filtra od tego wejścia i dodawać gradient do wejścia. Znaczy, jechać po gradiencie, bo to zwiększa to, co wychodzi z filtra, aż dojdziemy do takiego punktu, dla którego wyjście z filtra jest duże. No więc podstawy są proste, ale jak próbowałem napisać ten kod, to ciągle coś mi nie działało, a jak szukałem przykładów, to albo u mnie nie działały, bo zakładały, że (jeśli nie przekręcam, bo słabo znam Kerasa) mamy wyłączoną eager evaluation, a przecież w nowym Kerasie ona jest domyślnie włączona (wiem, mogę wyłączyć, ale nie chciałem), albo były tak skomplikowane, że trudno się było połapać, co tam się dzieje i jak to ma się do tego, co ja próbuję zrobić. No i w końcu wziąłem przykład z oficjalnej dokumentacji (z https://keras.io/examples/vision/visualizing_what_convnets_learn/) i poupraszczałem go tak, aż dostałem ładny, prosty, działający przykład. Oto on:
# na podstawie https://keras.io/examples/vision/visualizing_what_convnets_learn/

from tensorflow import keras
import tensorflow as tf
import numpy as np
from IPython.display import Image, display

img_width = 180
img_height = 180
# Our target layer: we will visualize the filters from this layer.
# See `model.summary()` for list of layer names, if you want to change this.
layer_name = "conv3_block4_out"
filter_index = 1
learning_rate = 10.0

# Build a ResNet50V2 model loaded with pre-trained ImageNet weights
model = keras.applications.ResNet50V2(weights="imagenet", include_top=False)

# Set up a model that returns the activation values for our target layer
layer = model.get_layer(name=layer_name)
feature_extractor = keras.Model(inputs=model.inputs, outputs=layer.output)

img = tf.random.uniform((1, img_width, img_height, 3))
img = (img - 0.5) * 0.25

for i in range(50):
    with tf.GradientTape() as tape:
        tape.watch(img)
        activation = feature_extractor(img)
        # We avoid border artifacts by only involving non-border pixels in the loss.
        filter_activation = activation[:, 2:-2, 2:-2, filter_index]
        loss = tf.reduce_mean(filter_activation)
    grads = tape.gradient(loss, img)
    grads = tf.math.l2_normalize(grads)
    img += learning_rate * grads

img_ = img[0].numpy()
img_ -= img_.mean()
img_ /= img_.std() + 1e-5
img_ *= 0.15
img_ = img_[25:-25, 25:-25, :]
img_ += 0.5
img_ = np.clip(img_, 0, 1)
img_ *= 255
img_ = np.clip(img_, 0, 255).astype("uint8")
    
keras.preprocessing.image.save_img("0.png", img_)
display(Image("0.png"))
U mnie działa.

komentarze:

ksywa:

tu wpisz cyfrę cztery: (to takie zabezpieczenie antyspamowe)

komentarze wulgarne albo co mi się nie spodobają będę kasował


powrot na strone glowna

RSS