【问题标题】:How do I visualize a net in Pytorch?如何在 Pytorch 中可视化网络?
【发布时间】:2019-02-27 08:28:03
【问题描述】:
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)

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

'ResNet' object has no attribute 'grad_fn'

【问题讨论】:

  • 您使用的是哪个版本的 PyTorch?
  • 大师的最新消息
  • pytorch 对 tensorboard 的支持怎么样...?

标签: python machine-learning pytorch


【解决方案1】:

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

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

【讨论】:

  • 如何将图片保存为文件?
  • 这显示了当我们反向支持时会发生什么。但是我可以知道如何查看前支柱吗?
  • @LukAron 你的前传与后传有何不同?后向传播由前向传播(和梯度链规则)定义
【解决方案2】:

以下是使用不同工具的三种不同图形可视化。

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

class RNN(nn.Module):

    def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim):

        super().__init__()
        self.embedding  = nn.Embedding(input_dim, embedding_dim)
        self.rnn        = nn.RNN(embedding_dim, hidden_dim)
        self.fc         = nn.Linear(hidden_dim, output_dim)

    def forward(self, text):

        embedding       = self.embedding(text)
        output, hidden  = self.rnn(embedding)

        return self.fc(hidden.squeeze(0))

如果您print() 模型,这是输出。

RNN(
  (embedding): Embedding(25002, 100)
  (rnn): RNN(100, 256)
  (fc): Linear(in_features=256, out_features=1, bias=True)
)

以下是三种不同可视化工具的结果。

对于所有这些,您需要有可以通过模型的forward() 方法的虚拟输入。获取此输入的一种简单方法是从 Dataloader 中检索批处理,如下所示:

batch = next(iter(dataloader_train))
yhat = model(batch.text) # Give dummy batch to forward().

Torchviz

https://github.com/szagoruyko/pytorchviz

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

from torchviz import make_dot

make_dot(yhat, params=dict(list(model.named_parameters()))).render("rnn_torchviz", format="png")

此工具生成以下输出文件:

这是在我的模型中明确提及三层的唯一输出,embeddingrnnfc。运算符名称取自后向传递,因此有些难以理解。

隐藏层

https://github.com/waleedka/hiddenlayer

我相信这个工具使用了前向传递。

import hiddenlayer as hl

transforms = [ hl.transforms.Prune('Constant') ] # Removes Constant nodes from graph.

graph = hl.build_graph(model, batch.text, transforms=transforms)
graph.theme = hl.graph.THEMES['blue'].copy()
graph.save('rnn_hiddenlayer', format='png')

这是输出。我喜欢蓝色的阴影。

我发现输出的细节过多并且混淆了我的架构。比如为什么unsqueeze被提到这么多次?

内创

https://github.com/lutzroeder/netron

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

input_names = ['Sentence']
output_names = ['yhat']
torch.onnx.export(model, batch.text, 'rnn.onnx', input_names=input_names, output_names=output_names)

这是模型在应用程序中的样子。我认为这个工具非常漂亮:您可以缩放和平移,还可以深入了解图层和运算符。我发现的唯一缺点是它只做垂直布局。

【讨论】:

  • Netron 也支持水平布局(见菜单)
【解决方案3】:

如果您想保存图像,请使用torchviz 执行此操作:

# 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")

你得到的图片截图:

来源:http://www.bnikolic.co.uk/blog/pytorch-detach.html

【讨论】:

  • 这显示了当我们反向支持时会发生什么。但是我可以知道如何查看前支柱吗?
  • @LukAron 基本上是前面的道具......只是那些操作,但它的落后版本。
【解决方案4】:

您可以使用 TensorBoard 进行可视化。 PyTorch 1.2.0 版现在完全支持 TensorBoard。 更多信息: https://pytorch.org/docs/stable/tensorboard.html

【讨论】:

  • 请注意,由于绑定的性质,许多模块迄今为止会破坏图形导出。
【解决方案5】:

您可以查看 PyTorchViz (https://github.com/szagoruyko/pytorchviz),“一个用于创建 PyTorch 执行图和跟踪可视化的小包。”

【讨论】:

  • 如何将图形保存为图像?
  • from graphviz import Source; model_arch = make_dot(...); Source(model_arch).render(filepath);
  • 这显示了当我们反向支持时会发生什么。但是我可以知道如何查看前面的道具吗?
猜你喜欢
  • 2014-04-22
  • 2016-01-22
  • 2015-07-05
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多