ニューラルネットワークの学習プロセスでは、輪郭情報や詳細情報などの大量の画像情報を含むさまざまな特徴マップ情報が生成されますが、通常は最終的な出力結果のみが得られます。中間特徴マップ これにはほとんど注意が払われません。
2日前に弟が突然この質問をしたのですが、私には全く分かりませんでした、後で弟と一緒に調べたら、多分思いついたと思います。
つまり、各特徴抽出モジュールは特徴マップを出力し、その特徴マップの各ピクセルは実際には何らかの数値であるため、これらの数値を保存して画像の形で表示するだけで済みます。
この考えをもとにデザインしてみましょう。出力特徴マップを観察する場合、推論で消費するリソースが少なくなり、推論中に入力画像が何であるかを明確にできるため、出力に推論コードを使用できます。
達成したい効果については、次のとおりです。
原画:
出力特徴マップ:
では、どうやって進めればよいのでしょうか?
最初に、どの段階の特徴画像を出力するかを明確にする必要があります。ブロガーは、バックボーン ネットワークの 4 つの段階の出力結果を選択しました。出力される特徴マップのサイズは次のとおりです。
x的shape: torch.Size([1, 64, 200, 300])
x的shape: torch.Size([1, 128, 100, 150])
x的shape: torch.Size([1, 320, 50, 75])
x的shape: torch.Size([1, 512, 25, 38])
コード
モジュールが特徴マップを出力した後、特徴マップは numpy 形式で保存されます。
sb = x.cpu().data.numpy()
np.save('matric'+str(i)+'.npy', sb)#这里的i是对应四个阶段的id
numpy 形式のデータを読み取り、特徴マップに変換します。
import numpy as np
import os
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
def normalization(data): # NORMALIZE TO [0,1]
_range = np.max(data) - np.min(data)
data = (data - np.min(data)) / _range # [0,1]
return data
def fm_vis(feats, save_dir, save_name):
save_dir = os.path.join(save_dir, save_name)
if not os.path.exists(save_dir):
os.makedirs(save_dir)
feats = normalization(feats[0].cpu().data.numpy())
for idx in range(min(feats.shape[0], 200*300)): # CHANNLE NUMBER
fms = feats[idx, :, :]
plt.imshow(fms)
plt.savefig(os.path.join(save_dir, save_name + '_' + str(idx) + ".png"))
for i in range(0,4):
s_b1 = np.load('matric'+str(i)+'.npy')
print(s_b1)
s_b2 = torch.from_numpy(s_b1)
out_dir = "outputs"
s_b = s_b2.reshape(1, 64, 200, 300)
fm_vis(s_b, out_dir, "s_b_vis"+str(i))
最終結果: 4 段階の特徴マップが出力され、ブロガーはそのうちのいくつかを選択しました。