卷积神经网络可视化——Python实现

引言

深度学习模型学到的表示很难用人类可以理解的方式来提取和呈现。本文基于猫狗分类任务对所训练的模型进行可视化,对模型中特征图以及滤波器进行可视化,深化卷积神经网络特征提取的理解。

一、可视化输入图片的特征提取过程图

对于给定输入,利用已训练好的分类模型,展示网络中各个卷积层和池化层输出的特征图。

输入一张用于可视化的图片:

img_path='/Users/深度学习/cats_and_dogs_small/test/cats/cat.1700.jpg'
from keras.preprocessing import image #将图像处理成4D张量
import numpy as np
import matplotlib.pyplot as plt
img=image.load_img(img_path,target_size=(150,150))
img_tensor=image.img_to_array(img)
img_tensor=np.expand_dims(img_tensor,axis=0)
img_tensor/=255.
print(img_tensor.shape)
#显示测试图像
plt.imshow(img_tensor[0])
plt.show()

结果如图所示:

卷积神经网络可视化——Python实现_第1张图片

输出模型前8层的特征提取图(输入一个图像,这个模型系那个会返回原始模型前8层的激活值):

from keras import models
layer_outputs=[layer.output for layer in model.layers[:8]]
activation_model=models.Model(inputs=model.input,outputs=layer_outputs)

其中,模型第一层的特征图总共32个通道,下面是第4个和第7个通道的可视化。

activations=activation_model.predict(img_tensor)
first_layer_activation=activations[0]
print(first_layer_activation.shape)
plt.matshow(first_layer_activation[0,:,:,4],cmap='viridis')
plt.matshow(first_layer_activation[0,:,:,7],cmap='viridis')

左图为4channel,右图为7channel,结果如图所示:

卷积神经网络可视化——Python实现_第2张图片卷积神经网络可视化——Python实现_第3张图片

 模型前8层特征图的所有通道可视化:

layer_names=[]
for layer in model.layers[:8]:
    layer_names.append(layer.name)
    
images_per_row=16

for layer_name,layer_activation in zip(layer_names,activations):
    n_features=layer_activation.shape[-1]
    
    size=layer_activation.shape[1]
    
    n_cols=n_features//images_per_row
    display_grid=np.zeros((size*n_cols,images_per_row*size))
    
    for col in range(n_cols):
        for row in range(images_per_row):
            channel_image=layer_activation[0,:,:,col*images_per_row+row]
            channel_image-=channel_image.mean()
            channel_image/=channel_image.std()
            channel_image*=64
            channel_image+=128
            channel_image=np.clip(channel_image,0,255).astype('uint8')
            display_grid[col*size:(col+1)*size,row*size:(row+1)*size]=channel_image
            
    scale=1./size
    plt.figure(figsize=(scale*display_grid.shape[1],scale*display_grid.shape[0]))
    plt.title(layer_name)
    plt.grid(False)
    plt.imshow(display_grid,aspect='auto',cmap='viridis')

 结果如图所示:

卷积神经网络可视化——Python实现_第4张图片

卷积神经网络可视化——Python实现_第5张图片

卷积神经网络可视化——Python实现_第6张图片

等等后面的由于太大了截不完整,就不展示了,剩下的留给大家自己探索。 

总的来说:

可以看出,随着层数的加深,层所提取的特征变得越来越抽象,更高的层特征图包含越来越少的输入信息,而关于类别的信息越来越多。这与人类和动物感知世界的方式类似:人类观察一个场景几秒钟后,可以记住其中有哪些抽象物体(比如自行车、树),但记不住这些事物的具体外观。

你可能感兴趣的:(猫狗大战,深度学习,机器学习,人工智能)