前言:
目录
⚪f1 = f1.cpu().detach().numpy()
- import matplotlib.pyplot as plt
-
- # 这里的输入假定的是 [B,H,W,C] 自行确认!关于如何修改,写在后面啦~
- def Show_Feature(feature_map):
- # 1 将传入的特征图给到f1,os:单纯为了好记,可以直接用feature_map
- f1= feature_map
-
- # 2 确认特征图的shape.[B,H,W,C]
- print(f1.shape)
-
- # 3 预期希望的特征图shape [B,C,H,W]
- # 明显特征图shape是[B,H,W,C],利用permute进行调整
- f1 = f1.permute(0,3, 1, 2)
-
- # 4 确认特征图的shape [B,C,H,W]
- print(f1.shape)
-
- # 5 特征图向量从cuda转换到cpu,numpy格式
- # 自行检查特征向量位置,亦可根据报错进行修改
- # 目的 torch.Size([B,C,H,W]) 转换成 (B,C,H,W)
- # 可尝试 f1.cpu().numpy()
- f1 = f1.cpu().detach().numpy()
-
- # 6 确认特征图的shape (B,C,H,W)
- print(f1.shape)
-
- # 7 去除B (C,H,W)
- f1 = f1.squeeze(0)
-
- # 8 确认特征图的shape (C,H,W)
- print(f1.shape)
-
- # 9 开始规范作图
- # 特征图的数量,就是维度啦,图像通常256维,超过的需要降维!
- f1_map_num = f1.shape[0]
- # 图像行显示数量
- row_num = 16
- # 绘制图像
- plt.figure()
- #通过遍历的方式,将通道的tensor拿出
- for index in range(1, f1_map_num + 1):
- plt.subplot(row_num, row_num, index)
- plt.imshow(f1[index - 1], cmap='gray')
- plt.axis('off')
- plt.imsave( 'feature_map_save/'+str(index) + ".png", f1[index - 1])
- plt.show()
- return 0
-
- # 特征图位置直接调用!x:[B,H,W,C]
- Show_Feature(x)
实际上,看代码中的解读就很容易发现一些注意点!
有时后中间特征会以[B,HW相关变动,C],也就是没有H,W清晰的分开,此时,需要追寻中间数据是怎么得到的,还原一下!
- x = x.reshape(1,96,96,256)
- Show_Feature(x)
- # 降维放在类self.xxx的位置
- # 注意前两项就是维度 希望512变成256
- self.fe_rn =nn.Conv2d(512, 256,kernel_size=3,stride=1,padding=1,bias=False,)
-
- # reshape [1,144,512]
- x = x.reshape(1,12,12,512)
- # 降维的格式,做点交换
- x = x.permute(0,3,1,2)
- # 降维
- x = self.fe_rn(x)
- # 特征可视化格式,做点交换
- x = x.permute(0,2,3,1)
- Show_Feature(x)
实际上就是涉及numpy和tensor的转换问题: