深度神经网络可解释性:卷积核、权重和激活可视化(pytorch+tensorboard)

神经网络可解释性基础知识综述 神经网络的结构大都是黑盒模型,黑盒模型指的是在模型的输入和输出之间存在一定的映射关系,但具体的映射方式不太清楚或难以解释的模型。我们要从”只知其然”变为“知其所以然” 阅读详情
AI摘要

本文介绍深度神经网络训练过程中的可视化技巧,包括卷积核、参数直方图及激活映射的可视化方法,有助于理解模型训练状态。

引言

一直以来,深度神经网络作为一种功能强大的“黑盒”,被认为可解释性较弱。目前,常用的一种典型可解释性分析方法是就是可视化方法。

本文整理了深度神经网络训练过程中常用的可视化技巧,便于对训练过程进行分析和检查。

卷积核可视化

以resnet18为例,提取第一层的卷积核(7x7)进行可视化,可以看出大多提取的是边缘、角点之类的底层视觉特征。
在这里插入图片描述
在全连接层前的卷积层采用的是3x3卷积核,表达高层语义信息,更加抽象:

在这里插入图片描述

这里采用torchvision.utils.make_grid对卷积核进行网格化显示,图像网格的列数由nrow参数确定。

卷积核的可视化代码参考1进行修改:

def plot_conv(writer,model):
    for name,param in model.named_parameters():
        if 'conv' in name and 'weight' in name:
            in_channels = param.size()[1]	# 输入通道
            out_channels = param.size()[0]   # 输出通道
            k_w, k_h = param.size()[3], param.size()[2]   # 卷积核的尺寸
            kernel_all = param.view(-1, 1, k_w, k_h)  # 每个通道的卷积核
            kernel_grid = torchvision.utils.make_grid(kernel_all, normalize=True, scale_each=True, nrow=in_channels)
            writer.add_image(f'{name}_all', kernel_grid, global_step=0) 

参数直方图可视化

利用直方图可以对每一层参数的分布进行直观展示,便于分析模型参数的学习情况。

在这里插入图片描述
全连接层的参数分布如下图所示:

在这里插入图片描述

代码示例如下:

def plot_param_hist(writer,model):
    for name, param in model.named_parameters():
        writer.add_histogram(f"{name}", param, 0)

激活可视化

输入图像经过第一个卷积层的激活映射:

在这里插入图片描述
经过layer2和layer3的激活:
在这里插入图片描述

从pytorch模型中获取指定层的权重和激活的代码如下,参考facebook的工程2:

class GetWeightAndActivation:
    """
    A class used to get weights and activations from specified layers from a Pytorch model.
    """
    def __init__(self, model, layers):
        """
        Args:
            model (nn.Module): the model containing layers to obtain weights and activations from.
            layers (list of strings): a list of layer names to obtain weights and activations from.
                Names are hierarchical, separated by /. For example, If a layer follow a path
                "s1" ---> "pathway0_stem" ---> "conv", the layer path is "s1/pathway0_stem/conv".
        """
        self.model = model
        self.hooks = {}
        self.layers_names = layers
        # eval mode
        self.model.eval()
        self._register_hooks()

    def _get_layer(self, layer_name):
        """
        Return a layer (nn.Module Object) given a hierarchical layer name, separated by /.
        Args:
            layer_name (str): the name of the layer.
        """
        layer_ls = layer_name.split("/")
        prev_module = self.model
        for layer in layer_ls:
            prev_module = prev_module._modules[layer]

        return prev_module

    def _register_single_hook(self, layer_name):
        """
        Register hook to a layer, given layer_name, to obtain activations.
        Args:
            layer_name (str): name of the layer.
        """

        def hook_fn(module, input, output):
            self.hooks[layer_name] = output.clone().detach()

        layer = get_layer(self.model, layer_name)
        layer.register_forward_hook(hook_fn)

    def _register_hooks(self):
        """
        Register hooks to layers in `self.layers_names`.
        """
        for layer_name in self.layers_names:
            self._register_single_hook(layer_name)

    def get_activations(self, input, bboxes=None):
        """
        Obtain all activations from layers that we register hooks for.
        Args:
            input (tensors, list of tensors): the model input.
            bboxes (Optional): Bouding boxes data that might be required
                by the model.
        Returns:
            activation_dict (Python dictionary): a dictionary of the pair
                {layer_name: list of activations}, where activations are outputs returned
                by the layer.
        """
        input_clone = [inp.clone() for inp in input]
        if bboxes is not None:
            preds = self.model(input_clone, bboxes)
        else:
            preds = self.model(input_clone)

        activation_dict = {}
        for layer_name, hook in self.hooks.items():
            # list of activations for each instance.
            activation_dict[layer_name] = hook

        return activation_dict, preds

    def get_weights(self):
        """
        Returns weights from registered layers.
        Returns:
            weights (Python dictionary): a dictionary of the pair
            {layer_name: weight}, where weight is the weight tensor.
        """
        weights = {}
        for layer in self.layers_names:
            cur_layer = get_layer(self.model, layer)
            if hasattr(cur_layer, "weight"):
                weights[layer] = cur_layer.weight.clone().detach()
            else:
                logger.error(
                    "Layer {} does not have weight attribute.".format(layer)
                )
        return weights

对给定输入进行测试,输出指定层的激活映射,并绘制在tensorboard中:

# 模型测试,避免改变权重
model.eval()
        
# Set up writer for logging to Tensorboard format.
writer = tb.TensorboardWriter(cfg)
        
# 注册指定层的激活hook
layer_ls=["conv1","layer1/1/conv2","layer2/1/conv2","layer3/1/conv2","layer4/1/conv2"]
model_vis = GetWeightAndActivation(model, layer_ls)

# 给定一个输入,获取指定层的激活映射
activations, preds = model_vis.get_activations(inputs)

# 绘制激活映射(如画在tensorboard中)
plot_weights_and_activations(writer,activations,tag="Input {}/Activations: ".format(0))

小结

本文整理了深度神经网络常用的局部可视化代码,对卷积核、权重和激活映射进行可视化,便于对训练过程进行分析和检查。有需要的朋友可以马住收藏。


  1. https://zhuanlan.zhihu.com/p/54947519 ↩︎

  2. https://github.com/facebookresearch/SlowFast ↩︎

深度神经网络的可解释性,深度神经网络简单介绍 而深度学习中最著名的卷积神经网络CNN,在原来多层神经网络的基础上,加入了特征学习部分,这部分是模仿人脑对信号处理上的分级的。速读记忆的练习见《精英特全脑速读记忆训练》,用软件练习,每天一个多小时,一个月的时间,可以把阅读速度提高5、6倍,记忆力、注意力、思维、理解力等也会得到相应的提高,最终提高学习、复习效率,取得好成绩。然后要学会梳理自身学习情况,以课本为基础,结合自己做的笔记、试卷、掌握的薄弱环节、存在的问题等,合理的分配时间,有针对性、具体的去一点一点的去攻克、落实。这样能够促进理解,加深记忆。 阅读详情

相关推荐

系统逻辑人工神经网络专家系统等人工智能技术应用于

神经网络的是我的毕业论文的一部分。4.人工神经网络人的思维有逻辑性和直观性两种不同的基本方式。逻辑性的思维是指根据逻辑规则进行推理的过程;它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理。这一过程可以写成串行的指令,让计算机执行。然而,直观性的思维是将分布式存储的信息综合起来,结果是忽然间产生想法或解决问题的办法。这种思维方式的根本之点在于以下两点:1.信息是通过神经元上的兴奋模式分布在网络上;2.信息处理是通过神经元之间同时相互作用的动态过程来完成的。人工神经网络就是模拟人思维的

aifans_bert的博客 964

关于神经网络的权重信息和特征图的可视化

对神经网络隐藏层的可视化,以及参数权重的可视化

Henry的博客 5597

PyTorch模型可视化实战:从卷积核到激活映射的TensorBoard全链路解析

本文详细解析了PyTorch模型可视化实战,从卷积核到激活映射的全链路操作,通过TensorBoard工具实现深度神经网络的可解释性分析。文章涵盖卷积核可视化、权重分布诊断和激活映射分析等核心技巧,帮助开发者快速定位模型问题,提升调试效率。

weixin_30134145的博客 177

【深度学习 | 机器学习】干货满满 | 近万字总结了 12 个令人惊艳的神经网络可视化工具!

【深度学习 | 机器学习】干货满满 | 近万字总结了 12 个令人惊艳的神经网络可视化工具!

wzk4869的博客 8151

别再当‘炼丹师’了!用PyTorch+TensorBoard可视化你的CNN,看看模型到底‘学’到了啥

本文深入探讨了如何使用PyTorch和TensorBoard实现CNN模型的可视化诊断,帮助开发者从‘炼丹师’转变为理解模型内部机制的专业人士。通过卷积核可视化、激活映射分析和梯度流监控等方法,揭示深度神经网络的学习过程,提升模型的可解释性和调试效率。

weixin_32487557的博客 229

从‘边缘’到‘语义’:手把手教你用TensorBoard逐层可视化ResNet的‘认知’过程(PyTorch版)

本文详细介绍了如何使用TensorBoard逐层可视化ResNet模型的认知过程,从边缘检测到语义理解。通过PyTorch实现卷积核和激活可视化,帮助开发者深入理解深度神经网络的可解释性,提升模型调试和教学演示效果。

weixin_33708633的博客 233

别再当‘炼丹师’了!用PyTorch和TensorBoard可视化你的CNN,看看模型到底‘看’到了什么

本文介绍了如何使用PyTorch和TensorBoard可视化CNN模型,帮助开发者理解深度神经网络的可解释性。通过卷积核、权重和激活可视化技术,可以透视模型内部的学习过程,优化训练策略并提升模型性能。文章提供了详细的代码示例和实用技巧,让模型调试不再盲目。

weixin_32181267的博客 247

深度学习模型权重解析:从数学原理到工程实践

在深度学习领域,模型权重是神经网络的核心参数,它决定了模型如何从输入数据中提取特征并做出预测。从数学角度看,权重定义了特征变换的线性组合关系;从工程实践看,权重的初始化、训练更新和存储管理直接影响模型性能。理解权重分布、梯度传播和优化器机制,有助于诊断训练问题、提升模型泛化能力。特别是在卷积神经网络和Transformer架构中,权重的可视化与分析成为模型可解释性的关键。通过权重剪枝、量化等优化技术,可以在保持精度的同时大幅压缩模型尺寸,满足移动端和边缘计算场景的部署需求。本文围绕模型权重的本质,深入探讨了

weixin_33768481的博客 513

保姆级教程:手把手教你用TensorBoard记录PyTorch模型训练全过程(从权重分布到激活热图)

本文提供了一份详细的TensorBoard使用指南,帮助开发者通过PyTorch实现深度神经网络训练过程的可视化。从权重分布到激活热图,教程涵盖了TensorBoard的核心功能,包括标量指标记录、直方图分析和图像数据可视化,特别适合需要提升模型可解释性的开发者。

weixin_30985047的博客 334

深度学习模型权重:从核心原理到工程实践全解析

在深度学习中,模型权重是神经网络的核心参数,它定义了输入特征对输出的影响程度,本质上存储了模型对世界的“认知”和解决问题的“策略”。其原理基于梯度下降和反向传播算法,通过不断调整权重以最小化损失函数,使模型从数据中学习。这一过程的技术价值在于,高质量的训练权重是模型具备实际能力的关键,直接决定了模型的性能。因此,模型权重成为迁移学习、模型微调和部署优化的基础。在实际应用场景中,无论是使用预训练权重快速启动项目,还是对权重进行量化、剪枝以适应边缘部署,都离不开对权重的深入理解和操作。本文聚焦于模型权重的核心地

weixin_30399155的博客 371

神经网络计算模型评估:从参数本质到实践方法

在机器学习领域,参数模型是一类通过固定数量的参数来捕获数据内在规律的数学模型。其核心原理在于将学习到的知识编码为权重和偏置等可调参数,通过优化算法(如反向传播)从数据中学习这些参数的值。这种模型的价值在于其高效性和可部署性,一旦训练完成,仅需存储参数即可进行快速预测,广泛应用于计算机视觉、自然语言处理等场景。评估这类模型的计算模型,需要深入理解其作为参数模型的本质,即“参数就是模型从训练数据里学到的‘内在规则’被压缩成的数字集合”。这涉及到对模型结构、参数有效性及动态训练过程的综合分析,例如通过可视化激活分

weixin_33904756的博客 455

从‘黑盒’到‘白盒’:手把手教你用TensorBoard给ResNet18做个‘全身CT扫描’(PyTorch版)

本文详细介绍了如何使用TensorBoard和PyTorch对ResNet18进行可视化分析,从卷积核到逐层激活映射,揭示深度神经网络的内部工作机制。通过实战代码演示,帮助开发者理解模型的可解释性,提升对卷积神经网络视觉认知逻辑的掌握。

weixin_29952383的博客 227

PyTorch实战:从零构建八大核心神经网络模型(CNN/RNN/GAN/Transformer等)

神经网络作为深度学习的核心架构,通过模拟人脑神经元连接进行信息处理,其基本单元包括神经元、权重、偏置和激活函数。其工作原理是通过前向传播计算输出,再通过反向传播和梯度下降算法优化参数,以最小化预测误差。这项技术的核心价值在于能够自动从数据中学习复杂的特征表示,解决传统算法难以处理的模式识别问题。在工程实践中,神经网络已广泛应用于计算机视觉、自然语言处理、语音识别和推荐系统等场景。本文聚焦于使用PyTorch框架,通过可运行的代码实例,系统性地讲解并实现包括卷积神经网络(CNN)、循环神经网络(RNN)、生成

weixin_30321709的博客 335

从‘特征工程’到‘特征可视化’:手把手教你用PyTorch代码‘看见’ResNet每一层的学习成果

本文深入探讨了如何利用PyTorch实现ResNet的特征可视化,从底层卷积核到高层语义特征的逐层解析。通过详细的代码示例和可视化技术,揭示了深度神经网络的可解释性,帮助开发者直观理解ResNet从边缘检测到高级语义提取的认知过程。文章特别介绍了使用TensorBoard进行权重分析和激活可视化的实用方法。

weixin_33624741的博客 286

深度学习理论与PyTorch实战:从环境搭建到CNN实现完整指南

深度学习作为人工智能的核心技术,通过模拟人脑神经网络结构实现对复杂数据的学习与表征。其核心原理在于利用反向传播算法和梯度下降优化,自动从数据中提取多层次特征。这一技术价值在于能够端到端地解决图像识别、自然语言处理等高维难题,极大地推动了计算机视觉、语音识别等应用场景的智能化进程。PyTorch框架凭借其动态计算图和Pythonic设计,成为实现深度学习模型的流行工具,显著降低了算法实现的工程门槛。本文围绕PyTorch环境配置、张量运算、自动微分等热词展开,详细解析了从多层感知机到卷积神经网络(CNN)的构

weixin_30613727的博客 371

mysql8.0安装及配置超详细教程_mysql-8.0.15-winx64

MySQL8.0配置教程, 全网最详,同时有本地mysql和小皮系统见另一篇

小诺言的博客 2万+

PyTorch原生实现ResNet中间层可视化调试

深度神经网络的可解释性始于对中间表征的理解——ResNet作为经典残差架构,其特征传播依赖跳跃连接与多级抽象。理解各层激活分布、通道响应强度及shortcut路径行为,是诊断特征坍缩、梯度消失与注意力偏移的核心前提。基于PyTorch原生机制(非hook)实现block级特征截取,支持主路径/shortcut双路对比、通道级动态归一化与跨层激活轨迹分析,既满足新手理解反向传播作用域的需求,也支撑算法工程师向业务方交付可验证的归因证据。本文聚焦ResNet中间层可视化这一高频工程实践,覆盖从模型改造、特征抽取

weixin_34021089的博客 367

uniapp中renderjs实战:手把手教你实现SSE即时通讯(附完整代码)

本文通过一个完整的实战案例,详细讲解了如何在uni-app中使用RenderJS实现SSE即时通讯功能。文章剖析了RenderJS作为Vue视图层强力补充的原理,并提供了包含自动重连、状态管理等健壮性设计的完整代码,帮助开发者突破框架限制,高效集成浏览器原生API。

weixin_29005499的博客 188

新手小白的,Python人工智能的学习,pytorch的学习

TensorBoard是一个用于可视化和监控深度学习模型训练过程的工具。通过图形化的界面,开发者可以直观地看到模型的训练过程、数据的流动以及各种统计信息,从而更好地调试和优化模型。

欢迎大家评价。 441

Unity线性空间下PSD透明贴图黑边问题:原理分析与三种解决方案

在计算机图形学中,颜色空间转换与Alpha混合是渲染管线的基础环节。伽马空间与线性空间的差异源于显示设备与人眼感知的特性,现代渲染引擎采用线性工作流以实现更真实的光照计算。然而,当图像处理软件(如Photoshop)导出的纹理数据与游戏引擎(如Unity)的预期格式不匹配时,就会引发技术问题,影响视觉保真度与开发效率。具体表现为,在线性空间下进行Alpha Blend混合时,带透明通道的纹理边缘常出现异常黑边或颜色失真,其核心根源在于纹理数据是否经过“预乘”处理与sRGB标记的解读冲突。这一问题的解决对于提

weixin_34198762的博客 379

数字IC后端新手必看:Innovus从安装到跑通第一个设计的完整流程(附常用命令清单)

本文为数字IC后端设计新手提供了Cadence Innovus工具的完整实战指南。详细介绍了从环境搭建、软件安装与许可证配置,到加载网表、库文件和约束,并逐步完成布局规划、单元布局、时钟树综合、布线及物理验证的核心使用流程。文章最后附有常用Tcl命令清单,帮助初学者快速上手并跑通第一个设计。

vscode5coder的博客 1235

五大经典深度神经网络实战:从CNN到Transformer的PyTorch实现

深度神经网络作为人工智能的核心技术,通过模拟人脑神经元连接方式,实现了从数据中自动学习复杂模式的能力。其核心原理在于多层次的非线性变换与特征抽象,通过反向传播算法优化网络参数。这一技术价值在于能够处理高维、非结构化的海量数据,在图像识别、自然语言处理、序列预测等领域展现出强大性能。在应用场景上,卷积神经网络擅长处理图像等网格数据,循环神经网络及其变体LSTM专攻序列建模,生成对抗网络实现了数据生成与增强,而基于自注意力机制的Transformer则革新了序列处理范式。本文聚焦于这五大经典架构,通过PyTor

weixin_30587927的博客 296

嵌入式Linux开发必备:设备树插件动态加载实战指南(RK356x平台为例)

本文以RK356x平台为例,详细介绍了嵌入式Linux开发中设备树插件的动态加载实战。通过configfs接口,开发者可以在系统运行时动态修改硬件配置,实现外设的即插即用与调试,无需重启设备,极大提升了开发与调试效率。

w7x8y9z的博客 441
上一篇: 新版JupyterLab快捷键+调试技巧(建议收藏)
下一篇: 10行代码,带你理解自然底数e、自然指数ln
虾米小馄饨
博客等级 码龄12年 1万+粉丝 60原创
评论 26
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值