PyTorch小技巧:使用Hook可视化网络层激活(各层输出)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 这篇文章将演示如何可视化PyTorch激活层。可视化激活,即模型内各层的输出,对于理解深度神经网络如何处理视觉信息至关重要,这有助于诊断模型行为并激发改进。

这篇文章将演示如何可视化PyTorch激活层。可视化激活,即模型内各层的输出,对于理解深度神经网络如何处理视觉信息至关重要,这有助于诊断模型行为并激发改进。

我们先安装必要的库:

 pip install torch torchvision matplotlib

加载CIFAR-10数据集并可视化一些图像。这有助于理解模型处理的输入。

 importtorchvision
 importtorchvision.transformsastransforms
 importmatplotlib.pyplotasplt

 # Transformations for the images
 transform=transforms.Compose([
     transforms.Resize(256),
     transforms.CenterCrop(224),
     transforms.ToTensor(),
     transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
 ])

 # Load CIFAR-10 dataset
 trainset=torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
 trainloader=torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True)

 # Function to show images
 defimshow(img):
     img=img.numpy().transpose((1, 2, 0))
     mean=np.array([0.485, 0.456, 0.406])
     std=np.array([0.229, 0.224, 0.225])
     img=std*img+mean  # unnormalize
     plt.imshow(img)
     plt.show()

 # Get some images
 dataiter=iter(trainloader)
 images, labels=next(dataiter)

 # Display images
 imshow(torchvision.utils.make_grid(images))

看着很模糊的原因是我们使用的CIFAR-10图像32x32的,很小 。因为对于小图像,处理速度很快,所以CIFAR-10称为研究的首选。

然后我们加载一个预训练的ResNet模型,并在特定的层上设置钩子函数,以在向前传递期间捕获激活。

 import torch
 from torchvision.models import resnet18

 # Load pretrained ResNet18
 model = resnet18(pretrained=True)
 model.eval()  # Set the model to evaluation mode

 # Hook setup
 activations = {}
 def get_activation(name):
     def hook(model, input, output):
         activations[name] = output.detach()
     return hook

 # Register hooks
 model.layer1[0].conv1.register_forward_hook(get_activation('layer1_0_conv1'))
 model.layer4[0].conv1.register_forward_hook(get_activation('layer4_0_conv1'))

这样,在通过模型处理图像时就能捕获到激活。

 # Run the model
 with torch.no_grad():
     output = model(images)

通过上面钩子函数我们获得了激活下面就可以进行可视化

 # Visualization function for activations
 def plot_activations(layer, num_cols=4, num_activations=16):
     num_kernels = layer.shape[1]
     fig, axes = plt.subplots(nrows=(num_activations + num_cols - 1) // num_cols, ncols=num_cols, figsize=(12, 12))
     for i, ax in enumerate(axes.flat):
         if i < num_kernels:
             ax.imshow(layer[0, i].cpu().numpy(), cmap='twilight')
             ax.axis('off')
     plt.tight_layout()
     plt.show()
 # Display a subset of activations
 plot_activations(activations['layer1_0_conv1'], num_cols=4, num_activations=16)

结果如下:

 plot_activations(activations['layer4_0_conv1'], num_cols=4, num_activations=16)

PyTorch的钩子函数(hooks)是一种非常有用的特性,它们允许你在训练的前向传播和反向传播过程中插入自定义操作。这对于调试、修改梯度或者理解网络的内部运作非常有帮助。

利用 PyTorch 钩子函数来可视化网络中的激活是一种很好的方式,尤其是想要理解不同层如何响应不同输入的情况下。在这个过程中,我们可以捕捉到网络各层的输出,并将其可视化以获得直观的理解。

可视化激活有助于理解卷积神经网络中的各个层如何响应输入图像中的不同特征。通过可视化不同的层,可以评估早期层是否捕获边缘和纹理等基本特征,而较深的层是否捕获更复杂的特征。这些知识对于诊断问题、调整层架构和改进整体模型性能是非常宝贵的。

https://avoid.overfit.cn/post/c63b9b1130fe425ea5b7d0bedf209b2e

目录
相关文章
|
6天前
|
数据可视化 数据挖掘
【视频】复杂网络分析CNA简介与R语言对婚礼数据聚类社区检测和可视化|数据分享
【视频】复杂网络分析CNA简介与R语言对婚礼数据聚类社区检测和可视化|数据分享
13 2
|
10天前
|
数据可视化
R语言弹性网络Elastic Net正则化惩罚回归模型交叉验证可视化
R语言弹性网络Elastic Net正则化惩罚回归模型交叉验证可视化
18 1
|
1天前
|
机器学习/深度学习 数据可视化
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化(下)
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化
|
1天前
|
机器学习/深度学习 数据采集 数据可视化
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化(上)
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化
|
3天前
|
机器学习/深度学习 数据可视化
R语言用灰色模型 GM (1,1)、神经网络预测房价数据和可视化
R语言用灰色模型 GM (1,1)、神经网络预测房价数据和可视化
12 1
|
3天前
|
数据可视化 数据挖掘 网络可视化
R语言复杂网络分析各大电视台合播电视剧数量可视化
R语言复杂网络分析各大电视台合播电视剧数量可视化
|
5天前
|
人工智能 数据可视化
【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化
【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化
16 2
|
5天前
|
数据挖掘 网络可视化
R语言APRIORI关联规则、K-MEANS均值聚类分析中药专利复方治疗用药规律网络可视化
R语言APRIORI关联规则、K-MEANS均值聚类分析中药专利复方治疗用药规律网络可视化
|
5天前
|
数据可视化 数据挖掘
R语言用igraph对上海公交巴士路线数据进行复杂网络、网络图可视化
R语言用igraph对上海公交巴士路线数据进行复杂网络、网络图可视化
|
5天前
|
分布式计算 数据可视化 数据挖掘
R语言进行相关矩阵分析及其网络可视化
R语言进行相关矩阵分析及其网络可视化