Keras 中间层可视化,附代码详解,以Mnist数字为对象
最近搭建了个Resnet50 的神经网络模型,相看一看中间某一层的输出结果,想感性的感受下逐层提取特征的过程,以数字0为对象,对数字0逐层提取特征,话不多说直接上代码,关于如何搭建Resnet,可以参见博主的博客主页,也可以参见网上资料,关于如何搭建资源很丰富,在这里直接导入已经搭建并且 训练好的神经网络模型。
1 #!/usr/bin/env python 3.6 2 #_*_coding:utf-8 _*_ 3 #@Time :2019/11/16 22:42 4 #@Author :控制工程小小白 5 #@FileName: virtual.py 6 7 #@Software: PyCharm 8 from keras.models import load_model 9 from keras import backend as K 10 import cv2 11 import numpy as np 12 import processor 13 from matplotlib import pyplot as plt 14 from Resnet import Resnet50 15 from keras.models import Model 16 from keras import backend as K 17 from keras.layers import Input 18 model=Resnet50()#导入模型,该模型的搭建代码见博主的下一篇博客 19 image_path=r'G:\make_Mnist_data\mnist_train\0.jpg'#测试图片保存的路径 20 image=cv2.imread(image_path)#读取图片 21 22 image_arr = cv2.resize(image, (32, 32))# 根据载入的训练好的模型的配置,将图像统一尺寸 23 print(image_arr.shape) 24 image_arr = np.expand_dims(image_arr, axis=0) 25 26 model.load_weights('./My_keras_Resnet50_weight_Adma.h5') #给Resnet加载已经训练好了的权值文件。 27 layer_1 = K.function([model.layers[0].input], [model.layers[40].output])#第一个 model.layers[0],不修改,表示输入数据;第二个model.layers[you wanted],修改为你需要输出的层数的编号 28 29 print(model.layers[40].output.shape)#输出第40层的形状 30 31 #第40层后的特征图展示,输出是(?,19,19,512),(样本个数,特征图尺寸长,特征图尺寸宽,特征图个数) 32 33 plt.subplots_adjust(left=None, bottom=None, right=None, top=None, 34 wspace=None, hspace=None)#调整图与图之间的间隔 35 f1 = layer_1([image_arr])[0]#只修改inpu_image 36 for _ in range(512):#512表示特征图通道数 37 show_img = f1[:, :, :, _] 38 show_img.shape = [19, 19] 39 plt.subplot(32, 16, _ + 1)#将特征图显示为32行16列 40 plt.subplot(32, 16, _ + 1) 41 plt.imshow(show_img, cmap='gray') 42 plt.axis('off') 43 plt.show()
此图即是提取中间层的结果。