如何在 Pytorch 中可视化网络?

新手上路,请多包涵
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'

原文由 raaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 940
2 个回答

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

原文由 Shai 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

为了生成示例可视化,我将使用一个简单的 RNN 来执行从 在线教程 中获取的情感分析:

 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().

火炬维兹

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

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

火炬可视化输出

这是唯一在我的模型中明确提到三层的输出, embeddingrnn ,和 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')

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

隐藏层输出

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

耐创

https://github.com/lutzroeder/netron

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

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

这是模型在应用程序中的样子。我认为这个工具非常灵巧:您可以缩放和平移,还可以钻取图层和运算符。我发现的唯一缺点是它只能进行垂直布局。

耐创截图

原文由 stackoverflowuser2010 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题