keras可视化中间层特征

可视化中间层不同通道特征及所有卷积层特征

  1. 读取图片
#读取图片
from tensorflow.keras.preprocessing import image
path='xxx.jpg'
img = image.load_img(path,target_size=(224,224))
img=image.img_to_array(img)
x = np.expand_dims(img, axis=0)
x.shape
# output:(1,224,224,3)
  1. 预训练模型
    keras官方提供了很多预训练模型作为api接口,介绍详细并且可以选择是否需要fc层、是否预训练等,并将模型对应的预训练也封装,可以直接调用该模型的预训练preprocess_input。
    官方网址有详细案例及参数解释
    官方网址:https://keras-cn.readthedocs.io/en/latest/other/application/
# vgg模型
import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras.applications.vgg16 import preprocess_input, decode_predictions
import os
x=preprocess_input(x)
# include_top表示是否需要全连接层
# 从接口获取模型
vgg16=VGG16(weights='imagenet', include_top=True)
# 将数据放入模型
predict = vgg16.predict(x)
# decode_predictions输出类别概率
print('prediction: ',decode_predictions(predict))

# 可视化模型
from tensorflow.keras.utils import plot_model
plot_model(ResNet50(),show_shapes=True)
vgg16.summary()
  1. 利用VGG16提取特征,可视化某一层所有通道
# 抽取vgg所有层,即要显示的层
from collections import OrderedDict
layer_dict=OrderedDict()
# vgg第一层为input层,上述官网中也有抽取特征的方法
for layer in vgg16.layers[1:]:
    layer_dict[layer.name]=layer
    
from tensorflow.keras import backend as K
# 将网络中层输出出来
def get_activations(model, layer,input_img_data):
    activations_f=K.function([model.layers[0].input],[layer.output])
    activations=activations_f((input_img_data,False))
    return activations

#输出某一层不同通道的图片
layer_name='block1_conv2'
layer=layer_dict[layer_name]
activations=get_activations(vgg16,layer,x)
activation = activations[0]
activated_img = activation[0]
fig=plt.figure(figsize=(20,20))
n=8
# 一层中不同通道的图片
for i in range(8):
    for j in range(8):
        idx=n*i+j
        ax=fig.add_subplot(n,n,idx+1)
        ax.imshow(activated_img[:,:,idx])

结果:
各通道可视化
结果可以很明显的看到每个通道学习的并不是一种特征,从亮度、轮廓等多方面学习

  1. 抽取每层卷积层特征
# 抽取特征时需判断是否是卷积层,仅抽取卷积层特征
layers_conv = OrderedDict()
for layer in vgg16.layers:
    if 'conv' in layer.name:
        layers_conv[layer.name] = layer
    	print(layer.name)
activation_list=[]
for name, layer in layers_conv.items():
    activations_f = K.function([vgg16.layers[0].input], [layer.output,])
    activations = activations_f((x, False))
    activation_list.append(activations[0][0])
 
 
# 显示每个卷积层特征
from PIL import Image
idx=0
fig_2 = plt.figure(figsize=(10, 10))
for activation in activation_list:
    feature_map = np.mean(activation,axis=2)
    matplotlib.image.imsave('{0}.png'.format(idx), feature_map)
    ax = fig_2.add_subplot(4, 4, idx+1)
    ax.imshow(feature_map[:,:])
    idx=idx+1
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值