代码之家  ›  专栏  ›  技术社区  ›  raaj

如何在Pytorch中可视化网络?

  •  3
  • raaj  · 技术社区  · 6 年前
    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)
    

    resnet 来自pytorch模型。我该怎么做?我试着用 torchviz 但它给出了一个错误:

    'ResNet' object has no attribute 'grad_fn'
    
    2 回复  |  直到 3 年前
        1
  •  25
  •   Shai    6 年前

    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
    
        2
  •  26
  •   stackoverflowuser2010    4 年前

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

    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() 方法。获取此输入的一种简单方法是从数据加载器中检索批,如下所示:

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

    托奇维兹

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

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

    torchviz output

    这是唯一一个明确提到我模型中三层的输出, embedding , rnn ,和 fc . 运算符名称取自向后传递,因此有些运算符很难理解。

    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')
    

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

    hiddenlayer output

    我发现输出有太多细节,混淆了我的架构。例如,为什么 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 screenshot

        3
  •  14
  •   David J. user3890638    5 年前

    你可以看看皮托奇维兹( https://github.com/szagoruyko/pytorchviz

    Example PyTorchViz visualization

        4
  •  8
  •   Charlie Parker    4 年前

    这是你如何处理的 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")
    

    图片截图:

    enter image description here

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

        5
  •  1
  •   Sushant    5 年前

    现在,PyTorch 1.2.0版完全支持张力板。 https://pytorch.org/docs/stable/tensorboard.html