1+ #! /usr/bin/python
2+ # -*- coding: utf-8 -*-
3+
4+ from onnx import helper , numpy_helper
5+ from ..op_mapper import OpMapper
6+ from ...common import make_node
7+ from ..datatype_mapping import NP_TYPE_TO_TENSOR_TYPE
8+ import numpy as np
9+
10+ @OpMapper (['PadLayer' ])
11+ class PadLayer ():
12+ # supports v1-v12
13+
14+ @classmethod
15+ def version_1 (cls , node , ** kwargs ):
16+ onnx_node , onnx_value , onnx_init = [], [], []
17+ # get inputs outputs
18+ in_name = node ['in_nodes_name' ][0 ]
19+ out_name = node ['out_nodes_name' ][0 ]
20+ out_shape = node ['out_tensors' ][0 ]
21+ dtype = NP_TYPE_TO_TENSOR_TYPE [node ['dtype' ]]
22+ layer = node ['node' ].layer
23+ # get attrs
24+ value = np .array (layer .constant_values ).astype (node ['dtype' ])
25+ c_value = numpy_helper .from_array (value , name = 'value' )
26+ onnx_init .append (c_value )
27+ # processing mode
28+ mode_dict = {"CONSTANT" : 'constant' , "REFLECT" : 'reflect' ,"SYMMETRIC" : 'edge' }
29+ mode = mode_dict [layer .mode ]
30+ # processing padding. `pads` should be a 1D tensor of shape [2 * input_rank].
31+ # `pads` format should be: [x1_begin, x2_begin,...,x1_end, x2_end,...],
32+ padding = layer .padding
33+ pads_temp = padding [0 ]
34+ for i in np .arange (1 , len (padding )):
35+ pads_temp += padding [i ]
36+ pads = []
37+ for i in range (len (pads_temp )// 2 ):
38+ pads .append (pads_temp [2 * i ])
39+ for i in range (len (pads_temp ) // 2 ):
40+ pads .append (pads_temp [i * 2 + 1 ])
41+ pads = np .array (pads ).astype (np .int64 )
42+ p_value = numpy_helper .from_array (pads , name = 'pads' )
43+ onnx_init .append (p_value )
44+ # make nodes
45+ v_out = helper .make_tensor_value_info (out_name , dtype , shape = out_shape )
46+ onnx_value .append (v_out )
47+
48+ if mode == 'constant' :
49+ p_node , out = make_node ('Pad' , inputs = [in_name , 'pads' , 'value' ], outputs = [out_name ], mode = 'constan' )
50+ onnx_node .append (p_node )
51+ else :
52+ p_node , out = make_node ('Pad' , inputs = [in_name , 'pads' ], outputs = [out_name ], mode = mode )
53+ onnx_node .append (p_node )
54+
55+ return onnx_node , onnx_value , onnx_init
0 commit comments