Pytorch官方目前无法像tensorflow,咖啡那样直接给出形状信息,详见
https://github.com/pytorch/pytorch/pull/3043
以下代码算一种解决方案。由于CNN, RNN等模块实现不一样,添加其他模块支持可能需要改代码。
例如RNN中偏见是bool类型,其权重也不是存于体重属性中,不过我们只关注形状够用了。
该方法必须构造一个输入调用向前后(模型(x)调用)才可获取形状
utf - 8编码: 从进口OrderedDict集合 进口火炬 从火炬。autograd导入变量 进口火炬。神经网络是神经网络 导入模型。crnn作为crnn 进口json def get_output_size (summary_dict、输出): 如果isinstance(输出元组): 因为我在xrange (len(输出)): summary_dict[我]=OrderedDict () summary_dict[我]=get_output_size (summary_dict[我],[我])输出 其他: summary_dict [' output_shape ']=列表(output.size ()) 返回summary_dict def总结(input_size、模型): def register_hook(模块): def钩(模块、输入、输出): class_name=str (module.__class__) .split (“。”) [1] .split(“的”)[0] module_idx=len(总结) m_key=' % s - %我' % (class_name module_idx + 1) 摘要[m_key]=OrderedDict () 摘要[m_key] [' input_shape ']=列表(输入[0].size ()) 摘要[m_key]=get_output_size(总结(m_key),输出) params=0 “体重”如果hasattr(模块): params +=torch.prod (torch.LongTensor(列表(module.weight.size ()))) 如果module.weight.requires_grad: 摘要[m_key]['学习']=True 其他: 摘要[m_key]['学习']=False #如果hasattr(模块,“偏见”): #参数+=torch.prod (torch.LongTensor(列表(module.bias.size ()))) 摘要[m_key] [' nb_params ']=参数 如果不是isinstance(模块,nn.Sequential)和\ 不是isinstance(模块,nn.ModuleList)和\==模型(模块): hooks.append (module.register_forward_hook(钩)) #检查如果有多个输入到网络 如果isinstance (input_size[0],(列表、元组)): x=[变量(torch.rand (1 * in_size))在input_size in_size] 其他: x=变量(torch.rand (1 * input_size)) #创建属性 摘要=OrderedDict () 钩子=[] #注册钩 model.apply (register_hook) #传球前进 模型(x) #删除这些钩子 钩子的h: h.remove () 返回的总结 crnn=crnn。CRNN (32, 3755, 256, (1) x=总结([32128],crnn) 打印json.dumps (x) >之前以pytorch版CRNN为例,输出形状如下
{ " Conv2d-1 ": { “input_shape”: 1, 1, 128, “output_shape”: (64, 128), “学”:没错, “nb_params”: 576 }, " ReLU-2 ": { “input_shape”: (64, 128), “output_shape”: (64, 128), “nb_params”: 0 }, " MaxPool2d-3 ": { “input_shape”: (64, 128), “output_shape”: (64, 64), “nb_params”: 0 }, " Conv2d-4 ": { “input_shape”: (64, 64), “output_shape”: (128, 64), “学”:没错, “nb_params”: 73728 }, " ReLU-5 ": { “input_shape”: (128, 64), “output_shape”: (128, 64), “nb_params”: 0 }, " MaxPool2d-6 ": { “input_shape”: (128, 64), “output_shape”: (1 128 8, 32), “nb_params”: 0 }, " Conv2d-7 ": { “input_shape”: (1 128 8, 32), “output_shape”: (1 256 8, 32), “学”:没错, “nb_params”: 294912 }, " BatchNorm2d-8 ": { “input_shape”: (1 256 8, 32), “output_shape”: (1 256 8, 32), “学”:没错, “nb_params”: 256 }, " ReLU-9 ": { “input_shape”: (1 256 8, 32), “output_shape”: (1 256 8, 32), “nb_params”: 0 }, " Conv2d-10 ": { “input_shape”: (1 256 8, 32), “output_shape”: (1 256 8, 32), “学”:没错, “nb_params”: 589824 }, " ReLU-11 ": { “input_shape”: (1 256 8, 32), “output_shape”: (1 256 8, 32), “nb_params”: 0 }, " MaxPool2d-12 ": { “input_shape”: (1 256 8, 32), “output_shape”: 1 256 4, 33岁, “nb_params”: 0 }, " Conv2d-13 ": { “input_shape”: 1 256 4, 33岁, “output_shape”: 1 512 4, 33岁, “学”:没错, “nb_params”: 1179648 }, " BatchNorm2d-14 ": { “input_shape”: 1 512 4, 33岁, “output_shape”: 1 512 4, 33岁, “学”:没错, “nb_params”: 512 }, " ReLU-15 ": { “input_shape”: 1 512 4, 33岁, “output_shape”: 1 512 4, 33岁, “nb_params”: 0 }, " Conv2d-16 ": { “input_shape”: 1 512 4, 33岁, “output_shape”: 1 512 4, 33岁, “学”:没错, “nb_params”: 2359296 }, " ReLU-17 ": { “input_shape”: 1 512 4, 33岁, “output_shape”: 1 512 4, 33岁, “nb_params”: 0 }, " MaxPool2d-18 ": { “input_shape”: 1 512 4, 33岁, “output_shape”: 1, 512, 2, 34, “nb_params”: 0 }, " Conv2d-19 ": { “input_shape”: 1, 512, 2, 34, “output_shape”: 1 512 1, 33岁, “学”:没错, “nb_params”: 1048576 }, " BatchNorm2d-20 ": { “input_shape”: 1 512 1, 33岁, “output_shape”: 1 512 1, 33岁, “学”:没错, “nb_params”: 512 }, " ReLU-21 ": { “input_shape”: 1 512 1, 33岁, “output_shape”: 1 512 1, 33岁, “nb_params”: 0 }, " LSTM-22 ": { “input_shape”: (33, 512), " 0 ":{ “output_shape”: (33, 512) }, " 1 ":{ " 0 ":{ “output_shape”: [2, 256) }, " 1 ":{ “output_shape”: [2, 256) } }, “nb_params”: 0 }, " Linear-23 ": { “input_shape”: [512], “output_shape”: [256], “学”:没错, “nb_params”: 131072 }, " BidirectionalLSTM-24 ": { “input_shape”: (33, 512), “output_shape”: (33, 256), “nb_params”: 0 }, " LSTM-25 ": { “input_shape”: (33, 256), " 0 ":{ “output_shape”: (33, 512) }, " 1 ":{ " 0 ":{ “output_shape”: [2, 256) }, " 1 ":{ “output_shape”: [2, 256) } }, “nb_params”: 0 }, " Linear-26 ": { “input_shape”: [512], “output_shape”: [3755], “学”:没错, “nb_params”: 1922560 }, " BidirectionalLSTM-27 ": { “input_shape”: (33, 256), null null null null null nullpytorch中获取模型输入/输出形状实例