CNN 34 - 필터 극대화와 클래스 극대화: 딥러닝 시각화 이해하기

김성빈·2024년 5월 30일
0

Modern Computer Vision

목록 보기
84/117


1. 필터 최대화

  1. 주어진 컨볼루션 레이어에서 주어진 필터의 값을 최대화하는 손실 함수를 구축할 것이다
  2. 스토캐스틱 그래디언트 데상트(Stochastic Gradient Descent)를 사용하여 이 활성화 값을 최대화하도록 입력 영상의 값을 조정할 수 있습니다.

TF1.14 다운로드

!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))

사전 교육된 VGG16 모델을 로드

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' 층의 출력을 시각화

함수 정의

# 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 # 수정된 모델을 반환합니다.

ActivationMaximization 인스턴스 생성

특정 신경망 층의 활성화를 최대화하여 해당 층의 필터가 무엇을 학습했는지를 시각화

from tf_keras_vis.activation_maximization import ActivationMaximization

activation_maximization = ActivationMaximization(model, model_modifier, clone=False)

VGG16 모델의 특정 필터 활성화 최대화를 위한 손실 함수 정의

ActivationMaximization 클래스가 해당 필터의 활성화를 최대화하도록 유도

필터 번호를 변경함으로써 다른 필터의 활성화를 시각화할 수 있다.

filter_number = 7 # 활성화 값을 최대화할 필터 번호를 설정합니다.
def loss(output):
    return output[..., filter_number] # 출력 값에서 지정된 필터의 값을 반환합니다.

VGG16 모델의 합성곱 필터 시각화

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 클래스가 여러 필터의 활성화를 동시에 최대화할 수 있도록 해준다.

2. 클래스 극대화

VGGNet의 특정 클래스를 최대화하는 입력을 찾기 위함

라이브러리 로드 및 사전 훈련된 VGG16 모델 로드

# %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()

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글