一、前言
我们有时候需要可视化特征图,尤其是发paper,或者对比算法等情况。而且通过可视化特征图,也可以让我们对这个整个cnn模型更加熟悉,废话不多说了。
二、效果图
下面我会给出代码,效果图分为单channel绘图和1:1通道特征图融合图。
我生成了很多特征图,我就简单的放两张吧,意思意思。
单通道特征图
叠加后的特征图
三、代码
我再次描述清楚我的需求以及我现有的东西,我有网络的结构和网络的预训练权重,我想通过输入图片,得到图片在网络特定层的特征图。
从main()开始看代码,我会说得详细一点,尽量让大家看懂, 这样你修改起来会方便很多。
图片保存和读取的路径相关的问题,我就不说了,这里大家应该懂。
1.首先我们看导入的包,DepthCompletionFrontNet 这是我的网络结构,首先你要搭建起的你的网络(这个得有)。
2.看main()函数,定位到get_feature()函数
3.get_feature做了下面得几个事儿,第一,读取图片,也就是要输入网络得图片(我得网络是双分支,所以是读取两个图,这里你读取一个图就行,就 img_rgb 就行,把 img_pc 相关内容注释);第二,定义网络,实例化,载入预训练权重模型;第三,定义我们要提取出得特定层,这里必须和你网络结构定义得层一模一样,一模一样,一模一样。
4.已经定义的网络结构需要进行修改,假设你网络定义的代码如下:
# 仅仅举例子,我懒得补全了,直接csdn手打的
class Net(nn.Module):
super(Net,self).__init__()
self.conv1 = nn.conv1
self.conv2 = nn.conv2
self.conv3 = nn.conv3
forward(self,x):
x = conv1(x)
x = conv2(x)
x = conv3(x)
return x
网络的定义不需要修改,我们需要修改下网络的 forward,加入字典 all_dict去存储每层的tensor,forward修改如下:
forward(self,x):
all_dict =