!pip install --upgrade tf-keras-vis tensorflow
%reload_ext autoreload
%autoreload 2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
import tensorflow as tf
from tf_keras_vis.utils import num_of_gpus
_, gpus = num_of_gpus()
print('{} GPUs'.format(gpus))
from tensorflow.keras.applications.vgg16 import VGG16 as Model
# 로드 모델
model = Model(weights='imagenet', include_top=True)
model.summary()
VGG16 모델은 레이어가 엄청나게 많다.
이유는 VGG16 모델은 깊고 복잡한 합성곱 신경망으로, 여러 층의 합성곱(Convolutional) 및 최대 풀링(MaxPooling) 층을 포함하고 있기 때문에 레이어가 많다.
13개의 합성곱(Conv) 층과 3개의 완전 연결 층(FC)
# VGG16의 마지막 층인 'block5_conv3' 층의 출력을 시각화하기 위해 모델 출력을 대상 층의 출력으로 변경하는 수정자를 정의합니다.
layer_name = 'block5_conv3' # VGG16의 마지막 합성곱 층인 'block5_conv3' 층을 대상으로 합니다.
def model_modifier(current_model):
target_layer = current_model.get_layer(name=layer_name) # 대상 층을 가져옵니다.
new_model = tf.keras.Model(inputs=current_model.inputs,
outputs=target_layer.output) # 입력은 기존 모델과 같고, 출력은 대상 층의 출력인 새로운 모델을 정의합니다.
new_model.layers[-1].activation = tf.keras.activations.linear # 대상 층의 활성화 함수를 선형 함수로 설정합니다.
return new_model # 수정된 모델을 반환합니다.
특정 신경망 층의 활성화를 최대화하여 해당 층의 필터가 무엇을 학습했는지를 시각화
from tf_keras_vis.activation_maximization import ActivationMaximization
activation_maximization = ActivationMaximization(model, model_modifier, clone=False)
ActivationMaximization 클래스가 해당 필터의 활성화를 최대화하도록 유도
필터 번호를 변경함으로써 다른 필터의 활성화를 시각화할 수 있다.
filter_number = 7 # 활성화 값을 최대화할 필터 번호를 설정합니다.
def loss(output):
return output[..., filter_number] # 출력 값에서 지정된 필터의 값을 반환합니다.
VGG16 모델의 특정 필터를 시각화하여 해당 필터가 학습한 특징을 확인할 수 있도록 한다.
from tf_keras_vis.utils.callbacks import Print
# 최대 활성화 이미지 생성
activation = activation_maximization(loss, callbacks=[Print(interval=50)]) # 활성화 최대화를 수행하고 중간 결과를 출력합니다.
image = activation[0].astype(np.uint8) # 결과 이미지를 정수형으로 변환합니다.
# 시각화
subplot_args = { 'nrows': 1, 'ncols': 1, 'figsize': (3, 3),
'subplot_kw': {'xticks': [], 'yticks': []} } # 서브플롯 설정을 정의합니다.
f, ax = plt.subplots(**subplot_args) # 서브플롯을 생성합니다.
ax.imshow(image) # 이미지를 플롯에 표시합니다.
ax.set_title('filter[{:03d}]'.format(filter_number), fontsize=14) # 필터 번호를 제목으로 설정합니다.
plt.tight_layout() # 레이아웃을 조정하여 플롯 간 여백을 최적화합니다.
plt.show() # 플롯을 화면에 표시합니다.
각 단계에서 모델의 활성화 값을 최대화하기 위해 점진적으로 필터 값을 조정하고 있고,
Scores는 활성화 최대화 점수를 나타내며, 각 단계에서 변화하는 것을 볼 수 있다.
여러 합성곱 필터를 시각화하기 위한 손실 함수 정의
각 층에 대해 임의의 필터 값을 반환하는 손실 함수를 정의
filter_numbers = [63, 132, 320] # 시각화할 필터 번호를 설정합니다.
# 여러 필터 출력을 반환하는 손실 함수 정의
def loss(output):
return (output[..., filter_numbers[0]], output[..., filter_numbers[1]], output[..., filter_numbers[2]])
이 손실 함수는 ActivationMaximization 클래스가 여러 필터의 활성화를 동시에 최대화할 수 있도록 해준다.
VGGNet의 특정 클래스를 최대화하는 입력을 찾기 위함
# %autoreload 확장 기능을 로드하여 코드 변경 시 자동 재로드
%reload_ext autoreload
%autoreload 2
# 필요한 라이브러리 임포트
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
import tensorflow as tf
from tf_keras_vis.utils import num_of_gpus
# GPU 사용 가능 여부 확인
_, gpus = num_of_gpus()
print('{} GPUs'.format(gpus))
# VGG16 모델 임포트
from tensorflow.keras.applications.vgg16 import VGG16 as Model
# 모델 로드
model = Model(weights='imagenet', include_top=True)
model.summary()
%%time
# Do 500 iterations and Generate an optimizing animation
activations = activation_maximization(loss,
seed_input=seed_input,
steps=512,
callbacks=[ Print(interval=50)])
images = [activation.astype(np.uint8) for activation in activations]
# Render
subplot_args = { 'nrows': 1, 'ncols': 3, 'figsize': (9, 3),
'subplot_kw': {'xticks': [], 'yticks': []} }
f, ax = plt.subplots(**subplot_args)
for i, title in enumerate(image_titles):
ax[i].set_title(title, fontsize=14)
ax[i].imshow(images[i])
plt.tight_layout()
plt.show()