import matplotlib.pyplot as plt
from dataset import ImgDataset
from model import Model
"""Plot Saliency Map"""

cuda = False
img_indices = [83, 4218, 4707, 8598]  # 选择数据集中的几张图片

# 加载模型
if cuda:
    model = torch.load('../hw3_CNN/model.pth')
else:
    model = torch.load('../hw3_CNN/model.pth', map_location='cpu')
# 选择数据集
training_dataset = ImgDataset('../hw3_CNN/data/training', cuda)
images, labels = training_dataset.get_batch(img_indices)

# 计算Loss并求导
model.eval()
images.requires_grad_()  # 追踪loss关于images的梯度
y_pred = model(images)
loss_func = torch.nn.CrossEntropyLoss()
loss = loss_func(y_pred, labels)
loss.backward()
# 取出loss关于images的梯度
if cuda:
    saliencies = images.grad.abs().detach().cpu()
else:
    saliencies = images.grad.abs().detach()
saliencies = torch.stack([(item - item.min()) / (item.max() - item.min())
                          for item in saliencies])  # normalize
Esempio n. 2
0

# normalize
def normalize(imgs):
    return (imgs - imgs.min()) / (imgs.max() - imgs.min())


# 加载模型
if cuda:
    model = torch.load('../hw3_CNN/model.pth')
else:
    model = torch.load('../hw3_CNN/model.pth', map_location='cpu')
print(model)
# 选择数据集
training_dataset = ImgDataset('../hw3_CNN/data/training', cuda)
images, _ = training_dataset.get_batch(img_indices)
"""Filter Visualization:挑几张图片看看某个filter的输出"""
layer_output = None
model.eval()


# 在hook_func中,我們把第layer_idx层的output通过变量layer_output保存下来
def hook_func(model, input, output):
    global layer_output
    layer_output = output


# 开启hook:当forward过了第layer_idx层后,要先调用我们定义的hook_func,然后才可以继续forward下一层
hook_handle = model.cnn[layer_idx].register_forward_hook(hook_func)
# forward
if cuda: