提交 573650de authored 作者: Razvan Pascanu's avatar Razvan Pascanu

Add functionality to automatically plot computational graph of every scan

node in a graph.
上级 edad9e5a
...@@ -393,7 +393,7 @@ default_colorCodes = {'GpuFromHost' : 'red', ...@@ -393,7 +393,7 @@ default_colorCodes = {'GpuFromHost' : 'red',
def pydotprint(fct, outfile=None, def pydotprint(fct, outfile=None,
compact=True, format='png', with_ids=False, compact=True, format='png', with_ids=False,
high_contrast=False, cond_highlight = None, colorCodes = None, high_contrast=False, cond_highlight = None, colorCodes = None,
max_label_size=50): max_label_size=50, scan_graphs = False):
""" """
print to a file in png format the graph of op of a compile theano fct. print to a file in png format the graph of op of a compile theano fct.
...@@ -412,6 +412,10 @@ def pydotprint(fct, outfile=None, ...@@ -412,6 +412,10 @@ def pydotprint(fct, outfile=None,
right branch, ops that are on both branches right branch, ops that are on both branches
As an alternative you can provide the node that represents As an alternative you can provide the node that represents
the lazy if the lazy if
:param scan_graphs: if true it will plot the inner graph of each scan op
in files with the same name as the name given for the main
file to which the name of the scan op is concatenated and
some unique id
In the graph, box are an Apply Node(the execution of an op) and ellipse are variable. In the graph, box are an Apply Node(the execution of an op) and ellipse are variable.
If variable have name they are used as the text(if multiple var have the same name, they will be merged in the graph). If variable have name they are used as the text(if multiple var have the same name, they will be merged in the graph).
...@@ -428,7 +432,6 @@ def pydotprint(fct, outfile=None, ...@@ -428,7 +432,6 @@ def pydotprint(fct, outfile=None,
if colorCodes is None: if colorCodes is None:
colorCodes = default_colorCodes colorCodes = default_colorCodes
if outfile is None: if outfile is None:
outfile = os.path.join(config.compiledir,'theano.pydotprint.' + outfile = os.path.join(config.compiledir,'theano.pydotprint.' +
config.device + '.' + format) config.device + '.' + format)
...@@ -626,6 +629,27 @@ def pydotprint(fct, outfile=None, ...@@ -626,6 +629,27 @@ def pydotprint(fct, outfile=None,
g.write(outfile, prog='dot', format=format) g.write(outfile, prog='dot', format=format)
print 'The output file is available at',outfile print 'The output file is available at',outfile
if scan_graphs:
scan_ops = [x for x in fct_env.toposort() if x.op.__class__.__name__ == 'Scan']
path, fn = os.path.split(outfile)
basename = fn.split('.')[0]
# Safe way of doing things .. a file name may contain multiple .
ext = fn[len(basename):]
for idx, scan_op in enumerate(scan_ops):
# is there a change that name is not defined?
if hasattr(scan_op.op,'name'):
new_name = basename+'_'+scan_op.op.name+'_'+str(idx)
else:
new_name = basename+'_'+str(idx)
new_name = os.path.join(path, new_name+ext)
pydotprint(scan_op.op.fn, new_name, compact, format, with_ids,
high_contrast, cond_highlight, colorCodes,
max_label_size, scan_graphs)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论