상세 컨텐츠

본문 제목

CNN 모델 학습 시각화

인공지능/딥러닝

by 2^7 2022. 6. 28. 10:24

본문

은닉층 출력(Activation) 시각화

import tensorflow

tensorflow.__version__

2.8.0

1. 사전 학습된 모델 사용

1-1. Model Load

from tensorflow.keras.models import load_model

model = load_model('/content/drive/My Drive/Colab Notebooks/models/002_dogs_and_cats_small.h5')

앞서 학습한 모델(https://sh9406.tistory.com/59)참조


1-2. Model Summary

model.summary()


2. 시각화용 고양이 이미지

2-1. 고양이 이미지 선택

from tensorflow.keras.preprocessing import image
import numpy as np

img_path = '/content/drive/My Drive/Colab Notebooks/datasets/cat.jpg'

img = image.load_img(img_path, target_size = (150, 150))

2-2. Image Reshape & Normalization

img_tensor = image.img_to_array(img)
img_tensor = np.expand_dims(img_tensor, axis = 0)

img_tensor = img_tensor / 255.

print(img_tensor.shape)

(1, 150, 150, 3)


2-3. Visualization

import matplotlib.pyplot as plt

plt.imshow(img_tensor[0])
plt.show()


3. Layer 추출

3-1. 입력에 대해 8개 층의 출력을 반환하는 모델

from tensorflow.keras import models

layer_outputs = [layer.output for layer in model.layers[:8]]
activation_model = models.Model(inputs = model.input, outputs = layer_outputs)

3-2. activation_model Summary

activation_model.summary()


4. activation_model 적용

4-1. predict( )

activations = activation_model.predict(img_tensor)

4-2. First Layer

first_layer_activation = activations[0]

print(first_layer_activation.shape)

(1, 148, 148, 32)


4-3. 03_Feature_Map

plt.matshow(first_layer_activation[0, :, :, 2], cmap = 'viridis')
plt.show()


4-4. 09_Feature_Map

plt.matshow(first_layer_activation[0, :, :, 8], cmap = 'viridis')
plt.show()


4-5. 29_Feature_Map

plt.matshow(first_layer_activation[0, :, :, 28], cmap = 'viridis')
plt.show()


5. 전체 레이어 특징 추출

5-1. drawFeatureMap( ) 정의

def drawFeatureMap(activations):
  # Layer 이름을 그래프 제목으로 사용
  layer_names = []
  for layer in model.layers[:8]:
      layer_names.append(layer.name)

  images_per_row = 16
  
  for layer_name, layer_activation in zip(layer_names, activations):
      # 특성 맵에 있는 특성의 수
      n_features = layer_activation.shape[-1]

      # 특성 맵의 크기 (1, size, size, n_features)
      size = layer_activation.shape[1]

      # 활성화 채널을 위한 그리드 크기 계산
      n_cols = n_features // images_per_row
      display_grid = np.zeros((size * n_cols, images_per_row * size))

      # 각 활성화를 하나의 큰 그리드 채우기
      for col in range(n_cols):
          for row in range(images_per_row):
              channel_image = layer_activation[0,
                                               :, :,
                                               col * images_per_row + row]
              # 그래프로 나타내기 좋게 특성을 처리
              channel_image -= channel_image.mean()
              channel_image /= channel_image.std()
              channel_image *= 64
              channel_image += 128
              channel_image = np.clip(channel_image, 0, 255).astype('uint8')
              display_grid[col * size : (col + 1) * size,
                           row * size : (row + 1) * size] = channel_image

      # 그리드 출력
      scale = 1. / size
      plt.figure(figsize=(scale * display_grid.shape[1],
                          scale * display_grid.shape[0]))
      plt.title(layer_name)
      plt.grid(False)
      plt.imshow(display_grid, aspect = 'auto', cmap = 'viridis')

  plt.show()

5-2. drawFeatureMap( ) 실행

drawFeatureMap(activations)

728x90

관련글 더보기