Python 如何在Pytorch中可视化网络?

Python 如何在Pytorch中可视化网络?,python,machine-learning,pytorch,Python,Machine Learning,Pytorch,我想从pytorch模型中可视化resnet。我怎么做?我试图使用torchviz,但它给出了一个错误: import torch import torch.nn as nn import torch.optim as optim import torch.utils.data as data import torchvision.models as models import torchvision.datasets as dset import torchvision.transforms

我想从pytorch模型中可视化
resnet
。我怎么做?我试图使用torchviz,但它给出了一个错误:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import torchvision.models as models
import torchvision.datasets as dset
import torchvision.transforms as transforms
from torch.autograd import Variable
from torchvision.models.vgg import model_urls
from torchviz import make_dot

batch_size = 3
learning_rate =0.0002
epoch = 50

resnet = models.resnet50(pretrained=True)
print resnet
make_dot(resnet)

make_dot
需要一个变量(即带有
grad_fn
的张量),而不是模型本身。
尝试:


您可以看看PyTorchViz(),“一个创建PyTorch执行图和跟踪可视化的小软件包。”


您可以使用张力板进行可视化。 现在,PyTorch 1.2.0版完全支持TensorBoard。 更多信息:

如果要保存图像,请使用
torchviz
执行以下操作:

x = torch.zeros(1, 3, 224, 224, dtype=torch.float, requires_grad=False)
out = resnet(x)
make_dot(out)  # plot graph of variable, not of a nn.Module
您获得的图像截图:


来源:

这里有三种使用不同工具的不同图形可视化

为了生成示例可视化,我将使用一个简单的RNN来执行情绪分析,该分析取自:

类RNN(nn.模块):
定义初始(自身、输入尺寸、嵌入尺寸、隐藏尺寸、输出尺寸):
super()。\uuuu init\uuuuu()
self.embedding=nn.embedding(输入尺寸,嵌入尺寸)
self.rnn=nn.rnn(嵌入维度、隐藏维度)
self.fc=nn.线性(隐藏尺寸、输出尺寸)
def转发(自我,文本):
嵌入=自嵌入(文本)
输出,隐藏=self.rnn(嵌入)
返回self.fc(隐藏压缩(0))
如果您
print()

RNN(
(嵌入):嵌入(25002100)
(rnn):rnn(100256)
(fc):线性(输入特征=256,输出特征=1,偏差=真)
)
下面是三种不同可视化工具的结果

对于所有这些方法,都需要有可以通过模型的
forward()
方法传递的虚拟输入。获取此输入的一种简单方法是从数据加载器检索批,如下所示:

batch=next(iter(数据装载机列车))
yhat=model(batch.text)#为forward()提供虚拟批次。
火炬手

我相信这个工具使用反向传递生成它的图形,所以所有的盒子都使用PyTorch组件进行反向传播

来自torchviz导入make_dot的

make_dot(yhat,params=dict(list(model.named_parameters())).render(“rnn_torchviz”,format=“png”)
此工具生成以下输出文件:

这是唯一清楚地提到我的模型中三个层的输出,
嵌入
rnn
,和
fc
。运算符名称取自向后传递,因此其中一些名称很难理解

隐藏者

我相信这个工具使用向前传球

将hiddenlayer导入为hl
transforms=[hl.transforms.Prune('Constant')]#从图中删除常量节点。
graph=hl.build\u图(model、batch.text、transforms=transforms)
graph.theme=hl.graph.THEMES['blue'].copy()
graph.save('rnn\u hiddenlayer',format='png')
这是输出。我喜欢蓝色的色调

我发现输出有太多的细节,混淆了我的架构。例如,
unsqueze
为什么被提到这么多次

奈特隆

此工具是适用于Mac、Windows和Linux的桌面应用程序。它依赖于首先导出到的模型。然后应用程序读取ONNX文件并呈现它。然后,可以选择将模型导出到图像文件

input_names=[“句子”]
输出_名称=['yhat']
torch.onnx.export(模型,batch.text,'rnn.onnx',输入\名称=输入\名称,输出\名称=输出\名称)
下面是应用程序中模型的外观。我认为这个工具非常灵活:你可以缩放和平移,你可以钻取图层和操作符。我发现唯一的缺点是它只做垂直布局


您使用的是哪一版本的PyTorch?Master的最新版本PyTorch对tensorboard的支持如何?请注意,由于绑定的性质,到目前为止,许多模块都会中断图形导出。如何将图形保存为图像?
来自graphviz导入源
model_arch=make_dot(…)
源代码(模型)。渲染(文件路径)这显示了我们返回道具时发生的情况。但是我可以知道如何查看前道具吗?如何将图像保存为文件?这显示了我们使用后道具时发生的情况。但是我可以知道我怎么看前面的道具吗?@LukAron你的向前传球和向后传球有什么不同?向后传球是由向前传球(和梯度链规则)定义的,这显示了当我们向后传球时会发生什么。但我可以知道如何查看前道具吗?@LukAron这基本上是前道具…它只是那些操作,但它是向后的版本。Netron还支持水平布局(见菜单)
x = torch.zeros(1, 3, 224, 224, dtype=torch.float, requires_grad=False)
out = resnet(x)
make_dot(out)  # plot graph of variable, not of a nn.Module
# http://www.bnikolic.co.uk/blog/pytorch-detach.html

import torch
from torchviz import make_dot

x=torch.ones(10, requires_grad=True)
weights = {'x':x}

y=x**2
z=x**3
r=(y+z).sum()

make_dot(r).render("attached", format="png")