Tensorflow

Keras 이미지 Extract features 및 Feature map 그리기

카카오그래놀라 2020. 10. 29. 17:56

1. 이미지 features 추출하고, Feature map을 그리기. (with VGG16)

keras.io/api/applications/#extract-features-with-vgg16

from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input
import matplotlib.pyplot as plt

model = VGG16(weights='imagenet', include_top=False) # include_top = False를 하면 Flatten하기 전까지 레이어가 존재합니다.
# 직관적으로는 include_top에서 top가 이미지가 들어가는 부분일 것 같지만, 결과가 나오는 부분을 뜻합니다!

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

features = model.predict(x)
print(features.shape) # (1, 7, 7, 512) elephant.jpg 이미지 1개에 대한 512개의 피쳐가 7x7의 피쳐맵으로 구성되어 있습니다.

plt.imshow(features[0,:,:,3]) # 4번째 피쳐맵(특징)을 그려보자. cf. 0부터 시작하기에 4번째임.
# 여러개를 한 번에 그릴 수도 있습니다. matplotlib.pyplot에 대해 찾아보세요!

 

2. 모델 중간에 있는 레이어에 대한 특징을 추출해보자.

keras.io/api/applications/#extract-features-from-an-arbitrary-intermediate-layer-with-vgg19

from tensorflow.keras.applications.vgg19 import VGG19
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg19 import preprocess_input
from tensorflow.keras.models import Model
from matplotlib.pyplot as plt
import numpy as np

base_model = VGG19(weights='imagenet')

for layer in base_model.layers:
    print(layer.name) # layer의 이름을 볼 수 있습니다.

# layer 중 'block4_pool' layer의 특징을 추출해 봅시다.
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

block4_pool_features = model.predict(x)
plt.imshow(features[0,:,:,5]) # block4_pool 레이어의 features 중 6번째 feature map을 보여줘! cf. 0부터 시작하기에 6번째임!

 

3. 자신이 finetuning한 모델에 대한 특징을 추출해보자.

from tensorflow.keras.applications.vgg19 import VGG19
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg19 import preprocess_input
from tensorflow.keras.models import Model
from matplotlib.pyplot as plt
import numpy as np

base_model = VGG19(weights='imagenet', include_top=False, input_shape=INPUT_SHAPE)

x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(200, activation='softmax')(x)

model = Model(inputs=base_model.input, outputs=predictions)

for layer in base_model.layers:
    layer.trainable = True

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=["accuracy"])
model.fit(...) # 각자 준비한 Data로 fit 하기.

# 자신이 만든 layers의 output을 담은 layer_outputs
layer_outputs = [layer.output for layer in model.layers]
# 각 레이어의 output을 만들어 내는 model을 만들기
extract_model = Model(inputs=model.input, outputs=layer_outputs)
# 각 레이어마다의 feature들로 predict.
extract_features_by_layer = extract_model.predict(x)
print(extract_features_by_layer.shape) # 레이어 개수
print(extract_features_by_layer[-7].shape) # 7번째 레이어의 피쳐 개수와 피쳐맵의 크기를 볼 수 있습니다.
# 참고로 Fully Connected layer, Flatten Layer를 선택할 경우 피쳐맵을 그릴 수 없기 때문에
# layer.name을 참조하여 보고싶은 layer를 선택해서 피쳐맵을 보세요!
plt.imshow(extract_features_by_layer[-7][0,:,:,3]) # 뒤에서 7번째 레이어의 피쳐 중 4번째 피쳐맵을 보여줘.

정리

대부분 자신이 만든 모델의 feature map을 보기 위해 이 글을 검색하셨을 것 같습니다.

이를 위해서는 3번의 model.fit 아래부분을 참조하셔서 feature를 추출, feature map을 그리면 됩니다!