一个简单的栗子实现特征图可视化
# coding: utf-8
from keras.models import Model
import cv2
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.layers import Activation
from pylab import *
import keras
def get_row_col(num_pic):
squr = num_pic ** 0.5
row = round(squr)
col = row + 1 if squr - row > 0 else row
return row, col
def visualize_feature_map(img_batch):
feature_map = np.squeeze(img_batch, axis=0)
print(feature_map.shape)
feature_map_combination = []
plt.figure()
num_pic = feature_map.shape[2]
row, col = get_row_col(num_pic)
for i in range(0, num_pic):
feature_map_split = feature_map[:, :, i]
feature_map_combination.append(feature_map_split)
plt.subplot(row, col, i + 1)
plt.imshow(feature_map_split)
axis('off')
title('feature_map_{}'.format(i))
plt.savefig('feature_map.png')
plt.show()
feature_map_sum = sum(ele for ele in feature_map_combination)
plt.imshow(feature_map_sum)
plt.savefig("feature_map_sum.png")
def create_model():
model = Sequential()
model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(4, 4)))
model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(9, 3, 3, input_shape=img.shape))
model.add(Activation('relu'))
return model
if __name__ == "__main__":
img = cv2.imread('001.jpg')
model = create_model()
img_batch = np.expand_dims(img, axis=0)
conv_img = model.predict(img_batch)
visualize_feature_map(conv_img)
原始图像每一层的feature map
feature map 求和