딥러닝
컨브넷 필터 시각화
창민이 개발일지
2022. 6. 23. 13:59
컨브넷 핕터 시각화
- 입력: 빈이미지 -> 특정 필터의 응답을 최대화 하기 위해 컨브넷 이미지에 경사 상승법 적용
- 출력 이미지는 선택된 필터가 최대로 응답하는 이미지
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()
