keras 实现神经网络层特征图 可视化(基于retinanet项目)

from keras import backend as K
from keras.models import load_model
from matplotlib import pyplot as plt
import cv2
import numpy as np
from keras_retinanet import models
import math

def main():
    #装载训练好的模型,这里是使用keras_retinanet工程编写的load_model函数,实际上也是调用了keras.models import load_model方法
    model = models.load_model('G:/model/resnet50_csv_03_2019-05-24-1345.h5',backbone_name='resnet50')

    #读取图片
    images=cv2.imread("transformer_97.jpg")
    cv2.imshow("Image", images)


    #扩展图像的维度
    image_arr = np.expand_dims(images, axis=0)

    # 第一个参数,表示模型的输入层,[model.layers[0].input]表示输入数据;
    # 第二个参数,表示模型的输出层,可根据需要提取模型相应的中间层作为输出层,如[model.layers[2].output]表示获取中间层第2层作为输出层
    # 注意,layer_n实际上是一个函数
    layer_n = K.function([model.layers[0].input], [model.layers[200].output])

    #通过输入端输入数据,获取模型的输出结果
    f1 = layer_n([image_arr])[0]

    # 根据模型输出层的特征数,遍历输出层的所有特征图像(通常输出层是多通道的,不能直接显示出来)
    row_col = math.floor(f1.shape[3] ** 0.5)
    for _ in range(row_col*row_col):
        show_img = f1[:, :, :, _]
        print(f1.shape)
        feature_shape=show_img.shape
        #再次调整特征图像的维度,调整为2维特征
        show_img.shape = [feature_shape[1], feature_shape[2]]
        #根据特征数目计算显示的格子个数
        plt.subplot(row_col, row_col, _ + 1)
        #将图像投影到plt画布上
        plt.imshow(show_img)
        #关闭坐标
        plt.axis('off')
    plt.show()

if __name__ == '__main__':
    main()

 

你可能感兴趣的:(keras)