第七章:PyTorch可视化
一、网络结构可视化
1. Torchvision可视化
通过Torchvision进行可视化,可以帮助我们弄清神经网络每一层的输入结构、输出结构及参数等信息。
下图给出网络总的参数:11689512;可训练的参数为11689512;不可训练的参数为0;于此同时,当我们发现参数量很大的时候我们可以通过减少特定的层来减少参数量。
二、CNN可视化
理解CNN的重要一步是可视化,包括可视化特征是如何提取的、提取到的特征的形式以及模型在输入数据上的关注点等。
- 首先确定模型有哪些层,卷积层的是哪个。
用dict(resnet18.named_children())[‘conv1’]来查看网络的层结构。 - 需要确定卷积层参数的情况。
用 .weight.cpu().detach() - 查看kernel_set的大小,逐次遍历kernel_set的内容去获得卷积核,并用matplotlib来进行可视化
1.可视化CNN卷积核的方法
卷积核在CNN中负责提取特征,可视化卷积核能够帮助人们理解CNN各个层在提取什么样的特征,进而理解模型的工作原理。
2.可视化CNN特征图的方法–HOOK
我们需要在层上挂上钩子hook,当数据向水流一样向前传播后,这一层钩子上所留下的东西就是我们想要的特征图。
可视化CNN显著图(class activation map)
class activation map (CAM)的作用是判断哪些变量对模型来说是重要的,在CNN可视化的场景下,即判断图像中哪些像素点对预测结果是重要的
from pytorch_grad_cam import GradCAM,ScoreCAM,GradCAMPlusPlus,AblationCAM,XGradCAM,EigenCAM,FullGrad
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget
from pytorch_grad_cam.utils.image import show_cam_on_image
target_layers = [model.features[-1]]
# 选取合适的类激活图,但是ScoreCAM和AblationCAM需要batch_size
cam = GradCAM(model=model,target_layers=target_layers)
targets = [ClassifierOutputTarget(preds)]
# 上方preds需要设定,比如ImageNet有1000类,这里可以设为200
grayscale_cam = cam(input_tensor=img_tensor, targets=targets)
grayscale_cam = grayscale_cam[0, :]
cam_img = show_cam_on_image(rgb_img, grayscale_cam, use_rgb=True)
print(type(cam_img))
Image.fromarray(cam_img)
三、使用TensorBoard完成训练过程可视化
TensorBoard作为一款可视化工具能够满足上面提到的各种需求。TensorBoard由TensorFlow团队开发,最早和TensorFlow配合使用,后来广泛应用于各种深度学习框架的可视化中来。