본문 바로가기
  • 🦄 창민이 개발일지
딥러닝

컨브넷 필터 시각화

by 창민이 개발일지 2022. 6. 23.

컨브넷 핕터 시각화

  • 입력: 빈이미지 -> 특정 필터의 응답을 최대화 하기 위해 컨브넷 이미지에 경사 상승법 적용
  • 출력 이미지는 선택된 필터가 최대로 응답하는 이미지
from tensorflow import keras
from tensorflow.keras import layers, models
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

예시) 컨브넷 경사 상승법 적용

In [2]:
f=[[-1, -2, -1],
   [0, 0, 0],
   [1, 2, 1], ]
In [3]:
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(1, 3, activation='relu'),
])
model.build((None, 100, 100, 1))
In [4]:
model.set_weights([np.expand_dims(f, axis=(2, 3)), np.array([0])])
In [5]:
keras.utils.plot_model(model,show_shapes=True)
Out[5]:

0이 아닌 빈 이미지 생성

In [6]:
x = np.random.random((100, 100))
x = x.astype(np.float32)
x = np.expand_dims(x, axis=(0, 3))
x = tf.Variable(x)
In [7]:
plt.imshow(x[0,:,:,0])
plt.show()

Loss에 대한 x의 영향 즉 함수 f(x)에 대한 x의 기울기를 계산하는 것으로 기울기를 더하는 것은 해당 loss에 많은 영향을 주는 기울기을 가진 x는 더 커진다(강조).

In [8]:
learning_rate = 1000
for _ in range(20):
    with tf.GradientTape() as tape:
        y = model(x)
        activation = tf.reduce_mean(y)
    grad = tape.gradient(activation,x)
    x.assign_add(learning_rate*grad)
In [9]:
plt.imshow(x[0,:,:,0])
plt.show()
  • 컨브넷 필터가 찾으려는 시각적인 패턴과 개념
  • 입력: 빈이미지 -> 특정 필터의 응답을 최대화 하기 위해 컨브넷 이미지에 경사 상승법 적용
  • 출력 이미지는 선택된 필터가 최대로 응답하는 이미지

VGG16의 컨브넷 필터 시각화

In [57]:
model = keras.applications.VGG16(include_top=False,input_shape=(150,150,3))
In [58]:
layer_name = "block3_conv1"
In [59]:
filter_index = 0
In [60]:
layer_output = model.get_layer(layer_name).output[:,:,:,filter_index]
In [61]:
block_model = models.Model(model.input,layer_output)
In [62]:
optimizer = keras.optimizers.Adam()
losses = keras.losses.CategoricalCrossentropy()

0이 아닌 임의의 빈이미지 생성

In [63]:
input_img_data = np.random.random((1,150,150,3))*20 + 128
input_img_data = input_img_data.astype("float32")
input_img_data = tf.Variable(input_img_data)
In [64]:
step = 1

for i in range(40):

    with tf.GradientTape() as tape:
        x = block_model(input_img_data)
        loss = tf.reduce_mean(x)
    grads = tape.gradient(loss,input_img_data)
    grads /= (np.sqrt(np.mean(np.square(grads))) + 1e-5)
    loss_value = loss
    grads_value = grads
    
    input_img_data.assign_add(grads_value * step)
In [65]:
plt.imshow(input_img_data[0,:,:,:].numpy().astype('uint8'))
plt.show()

첫 번째 block3_conv1 층의 필터은 물방울 패턴에 반응하는 것 같다

'딥러닝' 카테고리의 다른 글

GAN개념과 DCGAN 구현  (0) 2022.07.12
stanford dogs 분석 및 학습하기  (1) 2022.06.23
클래스 활성화의 히트맵 시각화  (0) 2022.06.23
Cat vs Dog 분류 모델 만들기  (0) 2022.06.18
Keras.1 Modeling  (0) 2022.06.18