• 猫狗大战——猫狗分类模型卷积和池化的可视化


    引言

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

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

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

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

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

    结果如图所示:

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

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

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

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

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

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

    1. layer_names=[]
    2. for layer in model.layers[:8]:
    3. layer_names.append(layer.name)
    4. images_per_row=16
    5. for layer_name,layer_activation in zip(layer_names,activations):
    6. n_features=layer_activation.shape[-1]
    7. size=layer_activation.shape[1]
    8. n_cols=n_features//images_per_row
    9. display_grid=np.zeros((size*n_cols,images_per_row*size))
    10. for col in range(n_cols):
    11. for row in range(images_per_row):
    12. channel_image=layer_activation[0,:,:,col*images_per_row+row]
    13. channel_image-=channel_image.mean()
    14. channel_image/=channel_image.std()
    15. channel_image*=64
    16. channel_image+=128
    17. channel_image=np.clip(channel_image,0,255).astype('uint8')
    18. display_grid[col*size:(col+1)*size,row*size:(row+1)*size]=channel_image
    19. scale=1./size
    20. plt.figure(figsize=(scale*display_grid.shape[1],scale*display_grid.shape[0]))
    21. plt.title(layer_name)
    22. plt.grid(False)
    23. plt.imshow(display_grid,aspect='auto',cmap='viridis')

     结果如图所示:

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

    总的来说:

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

  • 相关阅读:
    Vuex的简介以及入门案例
    Java优雅解决空指针问题源码级别刨析Optional
    Gateway整合微服务文档:Knife4j文档请求异常、Swagger报错Failed to load API definition.
    TypeScript类的使用
    jmeter获取时间,beanshell断言和脚本,浏览器时间转换
    STM32F103实现激光测距传感器测距WT-VL53L0 L1
    MySQL索引原理之索引与约束
    性能测试_JMeter_connection timed out :connect
    C/C++编译器配置——MinGW下载安装
    目标检测算法——工业缺陷数据集汇总1(附下载链接)
  • 原文地址:https://blog.csdn.net/m0_72662900/article/details/126539430