-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathdraw_model.py
66 lines (53 loc) · 1.88 KB
/
draw_model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
# coding: utf-8
#
# Author: Kazuto Nakashima
# URL: http://kazuto1011.github.io
# Created: 2017-11-06
import torch
from graphviz import Digraph
from torch.autograd import Variable
from libs.models import *
def make_dot(var, params):
param_map = {id(v): k for k, v in params.items()}
node_attr = dict(
style="filled",
shape="box",
align="left",
fontsize="12",
ranksep="0.1",
height="0.2",
)
dot = Digraph(node_attr=node_attr, graph_attr=dict(size="12,12"))
seen = set()
def size_to_str(size):
return "(" + (", ").join(["%d" % v for v in size]) + ")"
def add_nodes(var):
if var not in seen:
if torch.is_tensor(var):
dot.node(str(id(var)), size_to_str(var.size()), fillcolor="orange")
elif hasattr(var, "variable"):
u = var.variable
dot.node(str(id(var)), size_to_str(u.size()), fillcolor="lightblue")
else:
dot.node(str(id(var)), str(type(var).__name__.replace("Backward", "")))
seen.add(var)
if hasattr(var, "next_functions"):
for u in var.next_functions:
if u[0] is not None:
dot.edge(str(id(u[0])), str(id(var)))
add_nodes(u[0])
if hasattr(var, "saved_tensors"):
for t in var.saved_tensors:
dot.edge(str(id(t)), str(id(var)))
add_nodes(t)
add_nodes(var.grad_fn)
return dot
if __name__ == "__main__":
# Define a model
model = PSPNet(n_classes=6, n_blocks=[3, 4, 6, 3], pyramids=[6, 3, 2, 1])
# Build a computational graph from x to y
x = torch.randn(2, 3, 512, 512)
y1, y2 = model(Variable(x))
g = make_dot(y1 + y2, model.state_dict())
g.view(filename="model", cleanup=True)