使用TorchLens可视化一个简单的神经网络

使用,torchlens,可视化,一个,简单,神经网络 · 浏览次数 : 188

小编点评

**内容生成时需要带简单的排版** **1.安装和设置graphvizsubprocess.CalledProcessError** * Command '[WindowsPath('dot'), '-Kdot', '-Tpdf', '-O', 'graph.gv']' returned non-zero exit status 1。 *解决方案是将D:\\Program Files\\Graphviz\\bin添加到系统环境变量PATH中。 **2.使用torchlens可视化一个简单的神经网络** * 参考文献:[1]torchlens_tutorial.ipynb:https://colab.research.google.com/drive/1ORJLGZPifvdsVPFqq1LYT3t5hV560SoW?usp=sharing#scrollTo=W_94PeNdQsUN * 使用TorchLens可视化一个简单的神经网络。 **3.生成内容时需要带简单的排版** * 例如,生成内容时需要带简单的排版,例如格式化输出、添加标题等。

正文

  TorchLens:可用于可视化任何PyTorch模型,一个包用于在一行代码中提取和映射PyTorch模型中每个张量运算的结果。TorchLens功能非常强大,如果能够熟练掌握,算是可视化PyTorch模型的一把利剑。本文通过TorchLens可视化一个简单神经网络,算是抛砖引玉吧。

一.定义一个简单神经网络

import torch
import torch.nn as nn
import torch.optim as optim
import torchlens as tl
import os
os.environ["PATH"] += os.pathsep + 'D:/Program Files/Graphviz/bin/'


# 定义神经网络类
class NeuralNetwork(nn.Module): # 继承nn.Module类
    def __init__(self, input_size, hidden_size, output_size):
        super(NeuralNetwork, self).__init__() # 调用父类的构造函数
        # 定义输入层到隐藏层的线性变换
        self.input_to_hidden = nn.Linear(input_size, hidden_size)
        # 定义隐藏层到输出层的线性变换
        self.hidden_to_output = nn.Linear(hidden_size, output_size)
        # 定义激活函数
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        # 前向传播
        hidden = self.sigmoid(self.input_to_hidden(x))
        output = self.sigmoid(self.hidden_to_output(hidden))
        return output

def NeuralNetwork_train(model):
    # 训练神经网络
    for epoch in range(10000):
        optimizer.zero_grad()  # 清零梯度
        outputs = model(input_data)  # 前向传播
        loss = criterion(outputs, labels)  # 计算损失
        loss.backward()  # 反向传播和优化
        optimizer.step()  # 更新参数

        # 每100个epoch打印一次损失
        if (epoch + 1) % 1000 == 0:
            print(f'Epoch [{epoch + 1}/10000], Loss: {loss.item():.4f}')

    return model


def NeuralNetwork_test(model):
    # 在训练后,可以使用模型进行预测
    with torch.no_grad():
        test_input = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float32)
        predictions = model(test_input)
        predicted_labels = (predictions > 0.5).float()
        print("Predictions:", predicted_labels)


if __name__ == '__main__':
    # 定义神经网络的参数
    input_size = 2  # 输入特征数量
    hidden_size = 4  # 隐藏层神经元数量
    output_size = 1  # 输出层神经元数量

    # 创建神经网络实例
    model = NeuralNetwork(input_size, hidden_size, output_size)

    # 定义损失函数和优化器
    criterion = nn.BCELoss()  # 二分类交叉熵损失
    optimizer = optim.SGD(model.parameters(), lr=0.1)  # 随机梯度下降优化器

    # 准备示例输入数据和标签
    input_data = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float32)
    labels = torch.tensor([[0], [1], [1], [0]], dtype=torch.float32)

    # model:神经网络模型
    # input_data:输入数据
    # layers_to_save:需要保存的层
    # vis_opt:rolled/unrolled,是否展开循环
    model_history = tl.log_forward_pass(model, input_data, layers_to_save='all', vis_opt='unrolled')  # 可视化神经网络
    print(model_history)
    # print(model_history['input_1'].tensor_contents)
    # print(model_history['input_1'])
    
    tl.show_model_graph(model, input_data)
     
    # model = NeuralNetwork_train(model) # 训练神经网络
    # NeuralNetwork_test(model) # 测试神经网络

1.神经网络结构
  输入层包括2个神经元,隐藏层包括4个神经元,输出层包括1个神经元。
2.log_forward_pass
  给定输入x,通过模型运行前向传播,并返回一个包含前向传播日志(层激活和相应的层元数据)的ModelHistory对象。如果vis_opt设置为rolled或unrolled并可视化模型图。
3.show_model_graph
  可视化模型图,而不保存任何激活。
4.查看神经网络模型参数
权重(12)+偏置(5)共计17个参数,如下所示:


二.输出结果分析
1.model_history输出结果

Log of NeuralNetwork forward pass: // 神经网络前向传播日志
	Random seed: 1626722175 // 随机种子
	Time elapsed: 1.742s (1.74s spent logging) // 耗时
	Structure: // 结构
		- purely feedforward, no recurrence // 纯前馈,无循环
		- no branching // 无分支
		- no conditional (if-then) branching // 无条件(if-then)分支
		- 3 total modules // 3个模块
	Tensor info: // 张量信息
		- 6 total tensors (976 B) computed in forward pass. // 前向传播中计算的6个张量(976 B)
		- 6 tensors (976 B) with saved activations. // 6个张量(976 B)保存了激活
	Parameters: 2 parameter operations (17 params total; 548 B) // 参数:2个参数操作(总共17个参数;548 B)
	Module Hierarchy: // 模块层次
		input_to_hidden // 输入到隐藏
		sigmoid:1 // sigmoid:1
		hidden_to_output // 隐藏到输出
		sigmoid:2 // sigmoid:2
	Layers (all have saved activations): // 层(所有层都有保存的激活)
		  (0) input_1        // 输入
		  (1) linear_1_1     // 线性
		  (2) sigmoid_1_2    // sigmoid
		  (3) linear_2_3     // 线性
		  (4) sigmoid_2_4    // sigmoid
		  (5) output_1       // 输出

2.show_model_graph输出结果

(1)总共包含6层
  分别为input_1、linear_1_1、sigmoid_1_2、linear_2_3、sigmoid_2_4和output_1。
(2)总共6个张量
  指的是input_1(160B)、linear_1_1(192B)、sigmoid_1_2(192B)、linear_2_3(144B)、sigmoid_2_4(144B)和output_1(144B)。共计976B。
(3)input_1 4*2(160B)
  4*2表示input_1的shape,而160B指的是该张量在内存中占用空间大小,以字节(B)为单位。知道张量的形状和内存占用情况,对于模型内存管理和优化来说是很有用的信息。其它张量信息如下所示:

(4)共计17参数
  linear_1_1参数信息为4*2和*4,linear_1_1参数信息为1*4和*1,共计17参数,内存占用548B。

三.遇到的问题
1.需要安装和设置graphviz

subprocess.CalledProcessError: Command '[WindowsPath('dot'), '-Kdot', '-Tpdf', '-O', 'graph.gv']' returned non-zero exit status 1. 

解决方案是将D:\Program Files\Graphviz\bin添加到系统环境变量PATH中。

2.AlexNet神经网络
因为BP神经网络过于简单,接下来可视化一个稍微复杂点儿的AlexNet神经网络,如下所示:


参考文献:
[1]torchlens_tutorial.ipynb:https://colab.research.google.com/drive/1ORJLGZPifvdsVPFqq1LYT3t5hV560SoW?usp=sharing#scrollTo=W_94PeNdQsUN
[2]Extracting and visualizing hidden activations and computational graphs of PyTorch models with TorchLens:https://www.nature.com/articles/s41598-023-40807-0
[3]torchlens:https://github.com/johnmarktaylor91/torchlens
[4]Torchlens Model Menagerie:https://drive.google.com/drive/folders/1BsM6WPf3eB79-CRNgZejMxjg38rN6VCb
[5]使用TorchLens可视化一个简单的神经网络:github.com/ai408/nlp-engineering/tree/main/20230917_NLP工程化公众号文章/使用torchlens可视化一个简单的神经网络

与使用TorchLens可视化一个简单的神经网络相似的内容:

使用TorchLens可视化一个简单的神经网络

TorchLens:可用于可视化任何PyTorch模型,一个包用于在一行代码中提取和映射PyTorch模型中每个张量运算的结果。TorchLens功能非常强大,如果能够熟练掌握,算是可视化PyTorch模型的一把利剑。本文通过TorchLens可视化一个简单神经网络,算是抛砖引玉吧。 一.定义一个简

使用Cloudflare Worker加速docker镜像

前言 开发者越来越难了,现在国内的docker镜像也都️了,没有镜像要使用docker太难了,代理又很慢 现在就只剩下自建镜像的办法了 GitHub上有开源项目可以快速搭建自己的镜像库,不过还是有点麻烦,还好Cloudflare暂时还活着‍ 本文记录一下使用 Cloudf

使用C#/.NET解析Wiki百科数据实现获取历史上的今天

创建一个webapi项目做测试使用。 创建新控制器,搭建一个基础框架,包括获取当天日期、wiki的请求地址等 创建一个Http请求帮助类以及方法,用于获取指定URL的信息 使用http请求访问指定url,先运行一下,看看返回的内容。内容如图右边所示,实际上是一个Json数据。我们主要解析 大事记 部

Pybind11和CMake构建python扩展模块环境搭建

使用pybind11的CMake模板来创建拓展环境搭建 从Github上下载cmake_example的模板,切换分支,并升级pybind11子模块到最新版本 拉取pybind11使用cmake构建工具的模板仓库 git clone --recursive https://github.com/mr

说说RabbitMQ延迟队列实现原理?

使用 RabbitMQ 和 RocketMQ 的人是幸运的,因为这两个 MQ 自身提供了延迟队列的实现,不像用 Kafka 的同学那么苦逼,还要自己实现延迟队列。当然,这都是题外话,今天咱们重点来聊聊 RabbitMQ 延迟队列的实现原理,以及 RabbitMQ 实现延迟队列的优缺点有哪些? 很多人

使用FModel提取游戏资产

目录前言FModel简介FModel安装FModel使用初次使用资产预览资产导出附录dumperDumper-7生成usmap文件向游戏中注入dll 前言 这篇文章仅记录我作为初学者使用FModel工具提取某款游戏模型的过程。 FModel简介 FModel是一个开源软件,可以用于查看和提取UE4-

使用GSAP制作动画视频

GSAP 3Blue1Brown给我留下了深刻印象。利用动画制作视频,内容简洁,演示清晰。前两天刚好碰到一件事,我就顺便学习了一下怎么用代码做动画。 以javascrip为例,有两个动画引擎,GSAP和Animajs。由于网速的原因,询问了GPT后,我选择了GSAP来制作我的第一个动画视频。 制作动

使用ML.NET训练一个属于自己的图像分类模型,对图像进行分类就这么简单!

前言 今天大姚给大家分享一个.NET开源、免费、跨平台(支持Windows、Linux、macOS多个操作系统)的机器学习框架:ML.NET。并且本文将会带你快速使用ML.NET训练一个属于自己的图像分类模型,对图像进行分类。 ML.NET框架介绍 ML.NET 允许开发人员在其 .NET 应用程序

使用libzip压缩文件和文件夹

简单说说自己遇到的坑: 分清楚三个组件:zlib、minizip和libzip。zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主要是不知道如何归档,在zip内部形成对应的目录。这时就需要用更高级别的库,也就是minizip或li

使用gzexe加密shell脚本

使用 gzexe 加密 shell 脚本是一个相对简单的过程。以下是具体的步骤: 编写你的 shell 脚本:首先,你需要有一个 shell 脚本文件,比如 myscript.sh。 确保脚本可执行:使用 chmod 命令确保你的脚本文件是可执行的: chmod +x myscript.sh 使用