pytorch中获取模型输入/输出形状实例

  

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   null

pytorch中获取模型输入/输出形状实例