一 写在前面
未经允许,不得转载,谢谢。
这篇博客主要记录了如何提取特定层的特征,然后对它进行可视化。
二 主要的实现思路:处理单张图片作为网络输入。
根据给定的layer层,获取该层的输出结果features。
考虑到features的形状为:[batch_size, filter_nums, H, W] 提取其中的第一个过滤器得到的结果feature。
以一张图片作为输入的情况下,我们得到的feature即为[H,W]大小的tensor。
将tensor转为numpy,然后归一化到[0,1],最后乘255,使得范围为[0,255]
得到灰度图像并保存。
三 具体实现过程
了解实现流程之后整个代码没有什么难度,对其中的关键点进行简单说明一下:模型我用了在ImageNet预先训练好的vgg16作为示例。
打印模型结构可以看到每一层对应的id是什么。
通常选择conv后面的特征进行可视化。
整个的实现放在类FeatureVisualization中实现。
对于归一化到[0,1]的部分我用了sigmod方法。
需要特别交代的差不多就是这些,直接上代码了:import cv2import numpy as npimport torchfrom torch.autograd import Variablefrom torchvision import modelsdef preprocess_image(cv2im, resize_im=True):
"""
Processes image for CNNs
Args:
PIL_img (PIL_