最简单的方法当然可以直接打印(净),但是这样网络比较复杂的时候效果不太好,看着比较乱,以前使用咖啡的时候有一个网站可以在线生成网络框图,tensorflow可以用张量板,keras中可以用model.summary(),或者plot_model () .pytorch没有这样的API,但是可以用代码来完成。
<强>(1)安装环境:graphviz 强>
conda安装- n pytorch python-graphviz
或:
sudo apt-get安装graphviz
或者从官网下载,按此教程。
<强>(2)生成网络结构的代码:强>
def make_dot (var, params=None): ”“”产生的Graphviz表示PyTorch autograd图 蓝色节点变量要求研究生,橙色是张量 保存在torch.autograd.Function落后 参数: var:输出变量 (名称、变量的参数:dict)将名称添加到节点 要求毕业生(TODO:可选) ”“” 如果参数个数不是没有: 断言isinstance (params.values()[0],变量) param_map={id (v): k, k、v params.items ()} node_attr=dict(风格=疤盥? 形状=昂凶印? 对齐='左', 字形大??2”, ranksep=' 0.1 ', 身高=' 0.2 ') 点=有向图(node_attr=node_attr graph_attr=dict类型(大?12,12)) 看到=组() def size_to_str(尺寸): 返回' (' + (" ")。加入([' % d ' % v v的大小])+“)” def add_nodes (var): 如果var不在看到: 如果torch.is_tensor (var): dot.node (str (id (var)), size_to_str (var.size ()), fillcolor=俺壬? elif hasattr (var,“变量”): u=var.variable name=param_map [id (u)]如果参数个数不是没有别人” node_name=%年代\ n % s %(名称、size_to_str (u.size ())) dot.node (str (id (var))、node_name fillcolor=發ightblue”) 其他: dot.node (str (id (var)), str(类型(var) .__name__)) seen.add (var) 如果hasattr (var, next_functions): u var.next_functions: 如果你[0]不是没有: dot.edge (str (id (u [0])), str (id (var))) add_nodes (u [0]) 如果hasattr (var, saved_tensors): t var.saved_tensors: dot.edge (str (id (t)), str (id (var))) add_nodes (t) add_nodes (var.grad_fn) 返回点
<强>(3)打印网络结构:强>
进口火炬 从火炬。autograd导入变量 进口火炬。神经网络是神经网络 从graphviz进口有向图 类CNN (nn.module): def __init__(自我): ****** def向前(自我,x): ****** 返回了 ***************************** def make_dot(): #复制上面的代码 ***************************** if __name__==癬_main__”: 网=CNN () x=变量(火炬。randn (1, - 1, 1024, 1024)) y=净(x) g=make_dot (y) g.view () params=列表(net.parameters ()) k=0 因为我在参数: l=1 打印(“该层的结构:“+ str(列表(i.size ()))) 在i.size j (): j l *=打印(“该层参数和:“+ str (l)) k=k + l 打印(“总参数数量和:“+ str (k))
<>强(4)结果展示(例如这是一个resnet块类型的网络):强>
以上这篇pytorch打印网络结构的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。