经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
使用TorchLens可视化一个简单的神经网络
来源:cnblogs  作者:扫地升  时间:2023/9/18 9:03:17  对本文有异议

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

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

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. import torchlens as tl
  5. import os
  6. os.environ["PATH"] += os.pathsep + 'D:/Program Files/Graphviz/bin/'
  7. # 定义神经网络类
  8. class NeuralNetwork(nn.Module): # 继承nn.Module类
  9. def __init__(self, input_size, hidden_size, output_size):
  10. super(NeuralNetwork, self).__init__() # 调用父类的构造函数
  11. # 定义输入层到隐藏层的线性变换
  12. self.input_to_hidden = nn.Linear(input_size, hidden_size)
  13. # 定义隐藏层到输出层的线性变换
  14. self.hidden_to_output = nn.Linear(hidden_size, output_size)
  15. # 定义激活函数
  16. self.sigmoid = nn.Sigmoid()
  17. def forward(self, x):
  18. # 前向传播
  19. hidden = self.sigmoid(self.input_to_hidden(x))
  20. output = self.sigmoid(self.hidden_to_output(hidden))
  21. return output
  22. def NeuralNetwork_train(model):
  23. # 训练神经网络
  24. for epoch in range(10000):
  25. optimizer.zero_grad() # 清零梯度
  26. outputs = model(input_data) # 前向传播
  27. loss = criterion(outputs, labels) # 计算损失
  28. loss.backward() # 反向传播和优化
  29. optimizer.step() # 更新参数
  30. # 每100个epoch打印一次损失
  31. if (epoch + 1) % 1000 == 0:
  32. print(f'Epoch [{epoch + 1}/10000], Loss: {loss.item():.4f}')
  33. return model
  34. def NeuralNetwork_test(model):
  35. # 在训练后,可以使用模型进行预测
  36. with torch.no_grad():
  37. test_input = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float32)
  38. predictions = model(test_input)
  39. predicted_labels = (predictions > 0.5).float()
  40. print("Predictions:", predicted_labels)
  41. if __name__ == '__main__':
  42. # 定义神经网络的参数
  43. input_size = 2 # 输入特征数量
  44. hidden_size = 4 # 隐藏层神经元数量
  45. output_size = 1 # 输出层神经元数量
  46. # 创建神经网络实例
  47. model = NeuralNetwork(input_size, hidden_size, output_size)
  48. # 定义损失函数和优化器
  49. criterion = nn.BCELoss() # 二分类交叉熵损失
  50. optimizer = optim.SGD(model.parameters(), lr=0.1) # 随机梯度下降优化器
  51. # 准备示例输入数据和标签
  52. input_data = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float32)
  53. labels = torch.tensor([[0], [1], [1], [0]], dtype=torch.float32)
  54. # model:神经网络模型
  55. # input_data:输入数据
  56. # layers_to_save:需要保存的层
  57. # vis_opt:rolled/unrolled,是否展开循环
  58. model_history = tl.log_forward_pass(model, input_data, layers_to_save='all', vis_opt='unrolled') # 可视化神经网络
  59. print(model_history)
  60. # print(model_history['input_1'].tensor_contents)
  61. # print(model_history['input_1'])
  62. tl.show_model_graph(model, input_data)
  63. # model = NeuralNetwork_train(model) # 训练神经网络
  64. # 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输出结果

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

  1. 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可视化一个简单的神经网络

原文链接:https://www.cnblogs.com/shengshengwang/p/17710339.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号