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)
CNN(Convolutional Neural Network)-CIFAR 100_ResNet50V2 (0) | 2022.07.04 |
---|---|
CNN(Convolutional Neural Network)-CIFAR 10_Functional API Modeling (0) | 2022.06.29 |
CNN(Convolutional Neural Network)-VGG-16 (0) | 2022.06.27 |
CNN(Convolutional Neural Network)-이미지 데이터 셋을 이용한 CNN Modeling (0) | 2022.06.24 |
CNN(Convolutional Neural Network)-MNIST _Categorical Classification (0) | 2022.06.24 |