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
# 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: