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을 그리면 됩니다!
'Tensorflow' 카테고리의 다른 글
케라스 예제 번역: Simple MNIST convnet (0) | 2020.11.03 |
---|---|
텐서플로우 Dataset: repeat(), batch(), take() (2) | 2020.10.30 |
Tensorflow 케라스 EfficientNet Finetuning 예제 - 1 (0) | 2020.10.28 |
Tensorflow: input_tensor와 input_shape의 차이 (0) | 2020.10.28 |
텐서플로우 콜백 함수(tensorflow callback) (0) | 2020.05.16 |