Pytorch输出网络中间层特征可视化

本文主要介绍了如何提取特定层的特征,然后对它进行可视化。最后给出了不同网络的应用案例。
推荐一个GITHUN实现可视化的工具地址

整体步骤

  1. 加载已经预训练好的模型
  2. 使用单张图片作为输入
  3. 针对想要查看的特征提取层记录结果
  4. 网络中的特征提取结果的shapebatch_size, filter_nums, H, W, 因此要使用transpose函数对其维度进行转换
  5. tensor转为numpy, 然后根据预处理中transform进行的操作将逆操作后得到[0,1]区间的图像
  6. 将得到的filter_nums张图片拼接后输出

案例1: 自定义的模型(可修改forward)

1. 存储特征提取结果

没有听说过SiameseNetwork不重要,只需要知道如何暂存特征的结果并输出即可
最简单的做法就是在forward函数当中截取想要的结果并存储
下面给出网络的结构

class SiameseNetwork(nn.Module):def __init__(self):super().__init__()self.cnn1 = nn.Sequential(nn.ReflectionPad2d(1),nn.Conv2d(1, 4, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(4),nn.ReflectionPad2d(1),nn.Conv2d(4, 8, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(8),nn.ReflectionPad2d(1),nn.Conv2d(8, 8, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(8),)self.fc1 = nn.Sequential(nn.Linear(8 * 100 * 100, 500),nn.ReLU(inplace=True),nn.Linear(500, 500),nn.ReLU(inplace=True),nn.Linear(500, 5))self.fc2 = torch.nn.Linear(5, 1)def forward_once(self, x, type=1):output = self.cnn1(x)if type == 1:self.featuremap1 = outputelse:self.featuremap2 = outputoutput = output.view(output.size()[0], -1)output = self.fc1(output)return outputdef forward(self, input1, input2):output1 = self.forward_once(input1, 1)output2 = self.forward_once(input2, 2)x = torch.abs(output1 - output2)x = self.fc2(x)return x

我们需要可视化的通常是卷积之后的结果, 也就是CNN层的输出, 因此这里将self.cnn1(x)的结果存储到了self.featuremap当中
核心代码如下, 其中的type 是什么不重要,与该网络的应用有关。

     if type == 1:self.featuremap1 = outputelse:self.featuremap2 = output

2. 加载模型,输入单组图片

SiameseNetwork的输入需要有两张图片, 这里我将其封装为一个函数

其中关键的代码都已经给出了注释

net = SiameseNetwork()  # 定义模型
net.load_state_dict(torch.load(f'net30.pth')) # 加载与训练好的模型
transform_test = transforms.Compose([transforms.Resize((100, 100)),transforms.ToTensor()]) # 定义预处理操作
def test_one(path1, path2):'''单对图片测试'''img1 = Image.open(path1).convert('L')img2 = Image.open(path2).convert('L')img_tensor1 = transform_test(img1)img_tensor2 = transform_test(img2)img_tensor1.unsqueeze_(0) # 给tensor添加一个维度,模拟为batch=1 img_tensor2.unsqueeze_(0) output = net(img_tensor1, img_tensor2) # 单组图片进入网络得到结果feature_output1 = net.featuremap1.transpose(1, 0).cpu()feature_output2 = net.featuremap2.transpose(1, 0).cpu()feature_out1 = torchvision.utils.make_grid(feature_output1)feature_out2 = torchvision.utils.make_grid(feature_output2)feature_imshow(feature_out1, 'feature_out1')feature_imshow(feature_out2, 'feature_out2')# euclidean_distance = F.pairwise_distance(output1, output2)euclidean_distance = torch.sigmoid(output)concatenated = torch.cat((img_tensor1, img_tensor2), 0)imshow(torchvision.utils.make_grid(concatenated), 'Similarity: {:.2f}'.format(euclidean_distance.item()))

下面对提取特征的函数给出具体介绍,使用net.featuremap1操作来获取特征, 这里的featuremap1 也对应了我之前存储时候的self.featuremap1

transpose(1, 0).cpu() 是因为此时的特征为torch.Size([1, 8, 100, 100]) , 也就是(batch_size, filter_nums, H, W) 转换后才能方便输出

feature_output1 = net.featuremap1.transpose(1, 0).cpu()
feature_output2 = net.featuremap2.transpose(1, 0).cpu()

下面的代码是将若干幅图像拼成一幅图像, 在本文中feature_output有8张图片, 具体可以去百度搜torchvision.utils.make_grid功能

    feature_out1 = torchvision.utils.make_grid(feature_output1)feature_out2 = torchvision.utils.make_grid(feature_output2)

最重要的可视化函数是feature_imshow

首先读入inp, 转换为plt期望的格式
因为本文使用的transform没有针对meanstd进行处理, 传入的图像默认是在(0,1)之间的,所以这里不用进行逆操作,后文的其他案例会给出这种情况的解决办法。
np.clip(inp, 0, 1) 将小于0的像素都变为0,大于1的像素都变为1
不然会产生如下报错信息

Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

剩下 的就是简单的plt展示了,也没什么好解释的。

def feature_imshow(inp, title=None):"""Imshow for Tensor."""inp = inp.detach().numpy().transpose((1, 2, 0)) # 将通道数放在最后一维inp = np.clip(inp, 0, 1) plt.imshow(inp)if title is not None:plt.title(title)plt.pause(0.001)  # pause a bit so that plots are updated

3. 中间层特征结果

这里做的是汉字的比对,输入图片, 下图是经过特征提取之后的结果,清晰的学习到了汉字的特征。

案例2: torchvision.models中的预训练模型

详细的流程已经在上面讲了, 这里就给出此类pretrain过的模型应该如果输出中间结果的思路, 以inceptionV3为例

1.加载模型

这种模型可以直接从models自带的类中下载

model = models.inception_v3(pretrained=True, aux_logits=False)

2. 便利模型

可以采用下面代码的方式来便利网络, 不过这种方式通常在forwad中进行

for name, layer in model.named_modules():if 'conv' in name:print(layer)

拓展: 通过下面这种简单的方式就可以将卷积层的结构都保存下来

out_put = []
for name, layer in model.named_modules():x = layer(x)if 'conv' in name:out_put.append(layer(x))

for name, layer in model.named_modules():if name == '0':feature_layer = nn.Sequential(*list(layer.children())[:2])print(feature_layer)

这里通过*list(layer.children())[:2]来对网络解包,选取想要的部分

因为这里是网络的第一层,因此可以直接拿来使用, 如果你想要网络的后面某层中的卷积操作,需要保证前面的过程也完整的进行下来。

3. 可视化中间特征

因为本案例中的transforms我才去了自定义meanstd来进行Normalize

tf = transforms.Compose([transforms.Resize(299),transforms.RandomRotation(15),transforms.CenterCrop(resize),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
])

因此在feature_imshow函数中我们可以利用meanstd来对图像归一化, 得到更好的呈现结果。

def feature_imshow(inp, title=None):inp = inp.detach().numpy().transpose((1, 2, 0))mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]inp = std * inp + meaninp = np.clip(inp, 0, 1)plt.imshow(inp)if title is not None:plt.title(title)plt.axis('off')plt.pause(0.001)  # pause a bit so that plots are updatedplt.clf()

输入图像

中间特征(这里没有专门训练过,仅仅拿pretrain的来跑)

Pytorch输出网络中间层特征可视化相关推荐

  1. Deep Learning论文笔记之(七)深度网络高层特征可视化

    Deep Learning论文笔记之(七)深度网络高层特征可视化 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文,但老感 ...

  2. keras提取网络中间层输出、中间层特征

    最近想用自编码网络降维一下数据,用堆叠自编码器SAE降维之后提取中间层特征 model = Sequential()model.add(Dense(1024, activation='relu', i ...

  3. pytorch 神经网络特征可视化

    可参考博客 Pytorch可视化模型任意中间层的类激活热力图(Grad-CAM)_潜行隐耀的博客-CSDN博客_pytorch热力图 Pytorch输出网络中间层特征可视化_Joker-Tong的博客 ...

  4. 基于卷积神经网络故障诊断模型的 t-SNE特征可视化

    基于卷积神经网络故障诊断模型的 t-SNE特征可视化 1. t-sne可视化基本概念 2. sklearn.manifold.TSNE函数的参数说明 3. 基于tensorflow2卷积网络t-SNE ...

  5. pytorch 输出中间层特征

    pytorch 输出中间层特征: tensorflow输出中间特征,2种方式: 1. 保存全部模型(包括结构)时,需要之前先add_to_collection 或者 用slim模块下的end_poin ...

  6. 请概述可视化卷积神经网络的中间输出的基本思想。_万字长文:特征可视化技术(CAM)...

    前言 众所周知,深度学习是一个"黑盒"系统.它通过"end-to-end"的方式来工作,输入数据例如RGB图像,输出目标例如类别标签.回归值等,中间过程不可得知 ...

  7. CV之IE之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成不同尺寸和质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)—五个架构设计思维导图

    CV之IE之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成不同尺寸和质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)-五个架构设计思维导图 ...

  8. pytorch中使用TensorBoard进行可视化Loss及特征图

    pytorch中使用TensorBoard进行可视化Loss及特征图 安装导入TensorBoard 安装TensorBoard pip install tensorboard 导入TensorBoa ...

  9. CV之IG之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成带背景的不同尺寸高质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)案例

    CV之IG之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成带背景的不同尺寸高质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)案例 目录 基于 ...

最新文章

  1. Oracle to_char函数的使用方法
  2. 赛迪顾问2010-2011年度中国信息安全产品市场研究年度报告
  3. nginx压力测试和并发预估
  4. LeetCode Construct Quad Tree(dfs)
  5. 解决php文件包含的问题;Web_php_include-攻防世界
  6. 2018/7/18-纪中某C组题【jzoj3508,jzoj3509,jzoj3510,jzoj3512】
  7. $.post把表单对象传递过去_FormData对象
  8. java消费者生产者设计模式_java 多线程并发设计模式之四: 生产者消费者模式
  9. “C 不再是一种编程语言”
  10. linux新建用户切换后显示-bash-4.1$(转载)
  11. ydui的datetime日期选择组件
  12. [合集] 一线城市大龄男青年择偶指南
  13. Failed to obtain JDBC Connection
  14. 游戏中学会写代码:这些编程学习网站不容错过
  15. labview与PLC通讯
  16. android实现全国公祭日灰白模式
  17. 计蒜客 - 蒜头君的任务
  18. 大数据开发学习:进行大数据开发课程有哪些
  19. A problem has occurred and the system can‘t recover问题的解决
  20. admin_move_table的重组机制验证(失败了)

热门文章

  1. 【C++】c++ 11中的随机数 ——random
  2. 钓友海上遇险 山东海警连夜搜救
  3. esxi6.7虚拟机无法开机,提示“没有更多空间可供虚拟磁盘server-000001.vmdk使用。也许通过释放相关卷上的磁盘空间并单击 重试 继续此会话,单击 取消 可终止此会话”
  4. 落谷----P4994 终于结束的起点
  5. 最新最全论文合集——因果推理在计算机视觉中的应用
  6. 开课吧python课件_开课吧:廖雪峰数据分析全栈工程师第8期【视频+课件】-百度云下载...
  7. 2060显卡驱动最新版本_荣耀猎人游戏本V700 游戏本行业新生主力军-荣耀 ——快科技(驱动之家旗下媒体)-...
  8. 基金投资从入门到精通之一:基础知识篇
  9. 2013年11月-2014年5月规划
  10. numpy之np.ix_