Deep Learning/혼공 머신 러닝 - 딥러닝

[DL] 합성곱 신경망의 시각화

KimTory 2022. 1. 4. 23:46

[용어 정리]

 

① 가중치 시각화 : 합성곱 층의 가중치를 이미지로 출력하는 것

→ 합성곱 신경망은 주로 이미지를 다루기 때문에 가중치가 시각적인 패턴을 학습하는지에 대해 판단

 

② 특성 맵 시각화 : 합성곱 층의 활성화 출력을 이미지로 그리는 것 (특성 맵 : 합성곱 계산을 통해 얻은 출력)

→ 가중치 시각화와 함께 비교하여 각 필터가 이미지의 어느 부분을 활성화시키는지 확인

 

③ 함수형 API : 케라스에서 신경망 모델을 만드는 방법 중 하나

 


[함수형 API]

from tensorflow import keras


model = keras.models.load_model('best-cnn-model.h5')

print(model.input)

conv_acti = keras.Model(model.input, model.layers[0].output)
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

plt.imshow(train_input[0], cmap='gray_r')
plt.show()

inputs = train_input[0:1].reshape(-1, 28, 28, 1)/255.0

feature_maps = conv_acti.predict(inputs)

# (1, 28, 28, 32)
print(feature_maps.shape)

 

 

→ 첫 번째 필터는 수직선을 감지하고,  세 번째 필터는 전체적으로 밝은색이므로 전면이 모두 칠해진 영역을 감지

마지막 필터는 전체적으로 낮은 음수 값입니다. 이 필터와 큰 양수가  곱해지면 더 큰 음수가 되고 배경처럼 0에 가까운

값과 곱해지면 작은 음수가 된다.

fig, axs = plt.subplots(4, 8, figsize=(15,8))

for i in range(4):
    for j in range(8):
        axs[i, j].imshow(feature_maps[0,:,:,i*8 + j])
        axs[i, j].axis('off')

plt.show()

 

→ 64개의 특성 맵을 8개씩 나누어 출력

conv2_acti = keras.Model(model.input, model.layers[2].output)

feature_maps = conv2_acti.predict(train_input[0:1].reshape(-1, 28, 28, 1)/255.0)

print(feature_maps.shape)
# (1,14,14,64)

fig, axs = plt.subplots(8, 8, figsize=(12,12))

for i in range(8):
    for j in range(8):
        axs[i, j].imshow(feature_maps[0,:,:,i*8 + j])
        axs[i, j].axis('off')

plt.show()